Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
提交反馈
为 GitLab 提交贡献
登录
切换导航
I
ibizlab-util
项目
项目
详情
动态
版本
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
ibiz4jteam
ibizlab-util
提交
a6bfca56
提交
a6bfca56
编写于
12月 29, 2021
作者:
sq3536
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
init
上级
4f6069f5
变更
105
显示空白字符变更
内嵌
并排
正在显示
105 个修改的文件
包含
12735 行增加
和
1 行删除
+12735
-1
.gitignore
.gitignore
+15
-0
.ibizproject
.ibizproject
+0
-1
pom.xml
pom.xml
+516
-0
Audit.java
src/main/java/cn/ibizlab/util/annotation/Audit.java
+15
-0
DEField.java
src/main/java/cn/ibizlab/util/annotation/DEField.java
+80
-0
VersionCheck.java
src/main/java/cn/ibizlab/util/annotation/VersionCheck.java
+15
-0
AuditAspect.java
src/main/java/cn/ibizlab/util/aspect/AuditAspect.java
+170
-0
DEFieldDefaultValueAspect.java
...ava/cn/ibizlab/util/aspect/DEFieldDefaultValueAspect.java
+281
-0
DELogicAspect.java
src/main/java/cn/ibizlab/util/aspect/DELogicAspect.java
+465
-0
VersionCheckAspect.java
src/main/java/cn/ibizlab/util/aspect/VersionCheckAspect.java
+140
-0
CaffeineCacheConfig.java
src/main/java/cn/ibizlab/util/cache/CaffeineCacheConfig.java
+39
-0
RedisCacheConfig.java
src/main/java/cn/ibizlab/util/cache/RedisCacheConfig.java
+130
-0
CusCaffeineCache.java
...in/java/cn/ibizlab/util/cache/cache/CusCaffeineCache.java
+42
-0
CusRedisCache.java
src/main/java/cn/ibizlab/util/cache/cache/CusRedisCache.java
+31
-0
LayeringCache.java
src/main/java/cn/ibizlab/util/cache/cache/LayeringCache.java
+175
-0
CaffeineCacheManager.java
...ibizlab/util/cache/cacheManager/CaffeineCacheManager.java
+80
-0
LayeringCacheManager.java
...ibizlab/util/cache/cacheManager/LayeringCacheManager.java
+97
-0
RedisMessageListener.java
.../cn/ibizlab/util/cache/listener/RedisMessageListener.java
+69
-0
RedisPublisher.java
...n/java/cn/ibizlab/util/cache/listener/RedisPublisher.java
+38
-0
CustomJacksonSerializer.java
.../cn/ibizlab/util/cache/redis/CustomJacksonSerializer.java
+35
-0
IBZLiteFallback.java
src/main/java/cn/ibizlab/util/client/IBZLiteFallback.java
+16
-0
IBZLiteFeignClient.java
src/main/java/cn/ibizlab/util/client/IBZLiteFeignClient.java
+20
-0
IBZNotifyFallback.java
src/main/java/cn/ibizlab/util/client/IBZNotifyFallback.java
+34
-0
IBZNotifyFeignClient.java
...ain/java/cn/ibizlab/util/client/IBZNotifyFeignClient.java
+25
-0
IBZOUFallback.java
src/main/java/cn/ibizlab/util/client/IBZOUFallback.java
+15
-0
IBZOUFeignClient.java
src/main/java/cn/ibizlab/util/client/IBZOUFeignClient.java
+21
-0
IBZPayFallback.java
src/main/java/cn/ibizlab/util/client/IBZPayFallback.java
+29
-0
IBZPayFeignClient.java
src/main/java/cn/ibizlab/util/client/IBZPayFeignClient.java
+24
-0
IBZUAAFallback.java
src/main/java/cn/ibizlab/util/client/IBZUAAFallback.java
+31
-0
IBZUAAFeignClient.java
src/main/java/cn/ibizlab/util/client/IBZUAAFeignClient.java
+37
-0
IBZWFFallback.java
src/main/java/cn/ibizlab/util/client/IBZWFFallback.java
+51
-0
IBZWFFeignClient.java
src/main/java/cn/ibizlab/util/client/IBZWFFeignClient.java
+44
-0
StaticDict.java
src/main/java/cn/ibizlab/util/dict/StaticDict.java
+2981
-0
DELogic.java
src/main/java/cn/ibizlab/util/domain/DELogic.java
+22
-0
DTOBase.java
src/main/java/cn/ibizlab/util/domain/DTOBase.java
+120
-0
DTOClient.java
src/main/java/cn/ibizlab/util/domain/DTOClient.java
+18
-0
EntityBase.java
src/main/java/cn/ibizlab/util/domain/EntityBase.java
+133
-0
EntityClient.java
src/main/java/cn/ibizlab/util/domain/EntityClient.java
+30
-0
EntityMP.java
src/main/java/cn/ibizlab/util/domain/EntityMP.java
+38
-0
EntityMongo.java
src/main/java/cn/ibizlab/util/domain/EntityMongo.java
+6
-0
FileItem.java
src/main/java/cn/ibizlab/util/domain/FileItem.java
+21
-0
IBZConfig.java
src/main/java/cn/ibizlab/util/domain/IBZConfig.java
+78
-0
IBZDataAudit.java
src/main/java/cn/ibizlab/util/domain/IBZDataAudit.java
+33
-0
IBZUSER.java
src/main/java/cn/ibizlab/util/domain/IBZUSER.java
+116
-0
LiquibaseProp.java
src/main/java/cn/ibizlab/util/domain/LiquibaseProp.java
+23
-0
MappingBase.java
src/main/java/cn/ibizlab/util/domain/MappingBase.java
+36
-0
MsgBody.java
src/main/java/cn/ibizlab/util/domain/MsgBody.java
+63
-0
PayTrade.java
src/main/java/cn/ibizlab/util/domain/PayTrade.java
+39
-0
DEFieldDefaultValueType.java
...n/java/cn/ibizlab/util/enums/DEFieldDefaultValueType.java
+63
-0
DEPredefinedFieldType.java
...ain/java/cn/ibizlab/util/enums/DEPredefinedFieldType.java
+71
-0
DupCheck.java
src/main/java/cn/ibizlab/util/enums/DupCheck.java
+23
-0
RedisChannelTopic.java
src/main/java/cn/ibizlab/util/enums/RedisChannelTopic.java
+37
-0
BadRequestAlertException.java
...java/cn/ibizlab/util/errors/BadRequestAlertException.java
+40
-0
CustomParameterizedException.java
.../cn/ibizlab/util/errors/CustomParameterizedException.java
+41
-0
ErrorConstants.java
src/main/java/cn/ibizlab/util/errors/ErrorConstants.java
+16
-0
ExceptionTranslator.java
...main/java/cn/ibizlab/util/errors/ExceptionTranslator.java
+137
-0
FieldErrorVM.java
src/main/java/cn/ibizlab/util/errors/FieldErrorVM.java
+33
-0
InternalServerErrorException.java
.../cn/ibizlab/util/errors/InternalServerErrorException.java
+11
-0
ISearchContext.java
src/main/java/cn/ibizlab/util/filter/ISearchContext.java
+5
-0
QueryBuildContext.java
src/main/java/cn/ibizlab/util/filter/QueryBuildContext.java
+181
-0
QueryFilter.java
src/main/java/cn/ibizlab/util/filter/QueryFilter.java
+273
-0
QueryWrapperContext.java
...main/java/cn/ibizlab/util/filter/QueryWrapperContext.java
+222
-0
SearchContextBase.java
src/main/java/cn/ibizlab/util/filter/SearchContextBase.java
+174
-0
CachedBeanCopier.java
src/main/java/cn/ibizlab/util/helper/CachedBeanCopier.java
+33
-0
DEFieldCacheMap.java
src/main/java/cn/ibizlab/util/helper/DEFieldCacheMap.java
+252
-0
DataObject.java
src/main/java/cn/ibizlab/util/helper/DataObject.java
+618
-0
Globs.java
src/main/java/cn/ibizlab/util/helper/Globs.java
+195
-0
JSR310DateConverters.java
...ain/java/cn/ibizlab/util/helper/JSR310DateConverters.java
+149
-0
RuleUtils.java
src/main/java/cn/ibizlab/util/helper/RuleUtils.java
+690
-0
Setting.java
src/main/java/cn/ibizlab/util/helper/Setting.java
+90
-0
UniqueNameGenerator.java
...main/java/cn/ibizlab/util/helper/UniqueNameGenerator.java
+18
-0
PermissionSyncJob.java
src/main/java/cn/ibizlab/util/job/PermissionSyncJob.java
+80
-0
IBZConfigMapper.java
src/main/java/cn/ibizlab/util/mapper/IBZConfigMapper.java
+8
-0
IBZDataAuditMapper.java
src/main/java/cn/ibizlab/util/mapper/IBZDataAuditMapper.java
+7
-0
IBZUSERMapper.java
src/main/java/cn/ibizlab/util/mapper/IBZUSERMapper.java
+8
-0
AppController.java
src/main/java/cn/ibizlab/util/rest/AppController.java
+126
-0
AuthenticationController.java
...n/java/cn/ibizlab/util/rest/AuthenticationController.java
+60
-0
FileController.java
src/main/java/cn/ibizlab/util/rest/FileController.java
+85
-0
AuthPermissionEvaluator.java
...ava/cn/ibizlab/util/security/AuthPermissionEvaluator.java
+327
-0
AuthTokenUtil.java
src/main/java/cn/ibizlab/util/security/AuthTokenUtil.java
+18
-0
AuthenticationEntryPoint.java
...va/cn/ibizlab/util/security/AuthenticationEntryPoint.java
+27
-0
AuthenticationInfo.java
...ain/java/cn/ibizlab/util/security/AuthenticationInfo.java
+18
-0
AuthenticationUser.java
...ain/java/cn/ibizlab/util/security/AuthenticationUser.java
+325
-0
AuthorizationLogin.java
...ain/java/cn/ibizlab/util/security/AuthorizationLogin.java
+42
-0
AuthorizationTokenFilter.java
...va/cn/ibizlab/util/security/AuthorizationTokenFilter.java
+96
-0
SimpleTokenUtil.java
src/main/java/cn/ibizlab/util/security/SimpleTokenUtil.java
+171
-0
SpringContextHolder.java
...in/java/cn/ibizlab/util/security/SpringContextHolder.java
+41
-0
UAATokenUtil.java
src/main/java/cn/ibizlab/util/security/UAATokenUtil.java
+113
-0
AuthenticationUserService.java
...va/cn/ibizlab/util/service/AuthenticationUserService.java
+31
-0
FileService.java
src/main/java/cn/ibizlab/util/service/FileService.java
+11
-0
IBZConfigService.java
src/main/java/cn/ibizlab/util/service/IBZConfigService.java
+77
-0
IBZDataAuditService.java
...ain/java/cn/ibizlab/util/service/IBZDataAuditService.java
+19
-0
IBZUAAUserService.java
src/main/java/cn/ibizlab/util/service/IBZUAAUserService.java
+57
-0
IBZUSERService.java
src/main/java/cn/ibizlab/util/service/IBZUSERService.java
+11
-0
IBZUSERServiceImpl.java
...main/java/cn/ibizlab/util/service/IBZUSERServiceImpl.java
+88
-0
RemoteService.java
src/main/java/cn/ibizlab/util/service/RemoteService.java
+118
-0
SimpleAuditService.java
...main/java/cn/ibizlab/util/service/SimpleAuditService.java
+329
-0
SimpleFileService.java
src/main/java/cn/ibizlab/util/service/SimpleFileService.java
+72
-0
SimpleUserService.java
src/main/java/cn/ibizlab/util/service/SimpleUserService.java
+66
-0
FeignRequestInterceptor.java
...ain/java/cn/ibizlab/util/web/FeignRequestInterceptor.java
+48
-0
IBZOperationParameterReader.java
...java/cn/ibizlab/util/web/IBZOperationParameterReader.java
+148
-0
SearchContextHandlerMethodArgumentResolver.java
.../util/web/SearchContextHandlerMethodArgumentResolver.java
+45
-0
application-eureka.yml
src/main/resources/application-eureka.yml
+14
-0
application-nacos.yml
src/main/resources/application-nacos.yml
+12
-0
application-sys.yml
src/main/resources/application-sys.yml
+128
-0
未找到文件。
.gitignore
0 → 100644
浏览文件 @
a6bfca56
*volumes
*target
.settings
*node_modules
*bin
*.project
*.classpath
*.factorypath
.history
.vscode
.idea
**.iml
*.jar
*.log
.DS_Store
.ibizproject
已删除
100644 → 0
浏览文件 @
4f6069f5
devsys
\ No newline at end of file
pom.xml
0 → 100644
浏览文件 @
a6bfca56
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<artifactId>
ibizlab-util
</artifactId>
<name>
ibizlab-util
</name>
<description>
ibizlab-util
</description>
<version>
0.0.1
</version>
<!-- Spring Boot -->
<parent>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-parent
</artifactId>
<version>
2.2.1.RELEASE
</version>
</parent>
<properties>
<!-- Spring Cloud Alibaba(2.2.x.RELEASE) & Spring Cloud(Spring Cloud Greenwich) & Spring Boot(2.2.x.RELEASE) compatibility -->
<spring-cloud-alibaba.version>
2.2.1.RELEASE
</spring-cloud-alibaba.version>
<spring-cloud-openfeign.version>
2.2.1.RELEASE
</spring-cloud-openfeign.version>
<!-- Alibaba Druid -->
<alibaba-druid.version>
1.1.21
</alibaba-druid.version>
<!-- Mybatis Plus -->
<mybatis-plus.version>
3.3.1
</mybatis-plus.version>
<mybatis-plus-dynamic-datasource.version>
3.0.0
</mybatis-plus-dynamic-datasource.version>
<!-- Swagger2 -->
<springfox-swagger.version>
2.9.2
</springfox-swagger.version>
<!-- JBPM+Drools -->
<drools-version>
7.23.0.Final
</drools-version>
<!-- Error -->
<zalando-problem-spring-web.version>
0.23.0
</zalando-problem-spring-web.version>
<!-- Security -->
<spring-cloud-security.version>
2.1.1.RELEASE
</spring-cloud-security.version>
<maven-jar-plugin.version>
3.1.1
</maven-jar-plugin.version>
<!--logstash-logback-encoder-->
<logstash.version>
5.2
</logstash.version>
<!--Zuul网关-->
<spring-cloud-starter-netflix-zuul.version>
2.2.1.RELEASE
</spring-cloud-starter-netflix-zuul.version>
<!--MapStruct高性能属性映射工具-->
<mapstruct.version>
1.3.0.Final
</mapstruct.version>
<!--Java Web Token-->
<jsonwebtoken-jjwt.version>
0.9.1
</jsonwebtoken-jjwt.version>
<!--Liquibase数据库版本更新工具-->
<liquibase.version>
3.9.0
</liquibase.version>
<!--H2内存数据库-->
<h2.version>
1.4.200
</h2.version>
<!--caffeine缓存-->
<caffeine-cache.version>
2.6.0
</caffeine-cache.version>
<!--反序列化工具-->
<kryo.version>
4.0.2
</kryo.version>
<!--httpClient -->
<openfeign-httpclient.version>
11.0
</openfeign-httpclient.version>
<!--baomidou-jobs定时服务 -->
<baomidou-jobs.version>
1.0.3
</baomidou-jobs.version>
<!-- eureka微服务注册中心 -->
<eureka-client.version>
2.2.1.RELEASE
</eureka-client.version>
<!-- 阿里sentinel熔断器 -->
<alibaba-sentinel.version>
2.1.1.RELEASE
</alibaba-sentinel.version>
<!-- 阿里seata分布式事务 -->
<alibaba-seata.version>
1.3.0
</alibaba-seata.version>
<log4j2.version>
2.16.0
</log4j2.version>
<oracle.version>
19.8.0.0
</oracle.version>
<postgresql.version>
42.2.6
</postgresql.version>
<flowable-modeler.version>
6.4.2
</flowable-modeler.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Alibaba Cloud -->
<dependency>
<groupId>
com.alibaba.cloud
</groupId>
<artifactId>
spring-cloud-alibaba-dependencies
</artifactId>
<version>
${spring-cloud-alibaba.version}
</version>
<type>
pom
</type>
<scope>
import
</scope>
</dependency>
<!-- Spring Cloud -->
<dependency>
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-openfeign-dependencies
</artifactId>
<version>
${spring-cloud-openfeign.version}
</version>
<type>
pom
</type>
<scope>
import
</scope>
</dependency>
<!-- Alibaba Druid -->
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
druid
</artifactId>
<version>
${alibaba-druid.version}
</version>
</dependency>
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
druid-spring-boot-starter
</artifactId>
<version>
${alibaba-druid.version}
</version>
</dependency>
<!-- Mybatis Plus -->
<dependency>
<groupId>
com.baomidou
</groupId>
<artifactId>
mybatis-plus-boot-starter
</artifactId>
<version>
${mybatis-plus.version}
</version>
</dependency>
<dependency>
<groupId>
com.baomidou
</groupId>
<artifactId>
dynamic-datasource-spring-boot-starter
</artifactId>
<version>
${mybatis-plus-dynamic-datasource.version}
</version>
</dependency>
<!-- Liquibase -->
<dependency>
<groupId>
org.liquibase
</groupId>
<artifactId>
liquibase-core
</artifactId>
<version>
${liquibase.version}
</version>
</dependency>
<!-- H2 -->
<dependency>
<groupId>
com.h2database
</groupId>
<artifactId>
h2
</artifactId>
<version>
${h2.version}
</version>
</dependency>
<!-- Swagger2 -->
<dependency>
<groupId>
io.springfox
</groupId>
<artifactId>
springfox-swagger2
</artifactId>
<version>
${springfox-swagger.version}
</version>
</dependency>
<dependency>
<groupId>
io.springfox
</groupId>
<artifactId>
springfox-swagger-ui
</artifactId>
<version>
${springfox-swagger.version}
</version>
</dependency>
<!-- JBPM -->
<dependency>
<groupId>
org.jbpm
</groupId>
<artifactId>
jbpm-flow-builder
</artifactId>
<version>
${drools-version}
</version>
</dependency>
<dependency>
<groupId>
org.jbpm
</groupId>
<artifactId>
jbpm-bpmn2
</artifactId>
<version>
${drools-version}
</version>
</dependency>
<!-- Drools -->
<dependency>
<groupId>
org.drools
</groupId>
<artifactId>
drools-compiler
</artifactId>
<version>
${drools-version}
</version>
</dependency>
<dependency>
<groupId>
org.drools
</groupId>
<artifactId>
drools-core
</artifactId>
<version>
${drools-version}
</version>
</dependency>
<dependency>
<groupId>
org.kie
</groupId>
<artifactId>
kie-spring
</artifactId>
<version>
${drools-version}
</version>
</dependency>
<dependency>
<groupId>
org.kie
</groupId>
<artifactId>
kie-api
</artifactId>
<version>
${drools-version}
</version>
</dependency>
<!-- Error -->
<!-- Security -->
<dependency>
<groupId>
net.logstash.logback
</groupId>
<artifactId>
logstash-logback-encoder
</artifactId>
<version>
${logstash.version}
</version>
</dependency>
<dependency>
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-starter-netflix-zuul
</artifactId>
<version>
${spring-cloud-starter-netflix-zuul.version}
</version>
</dependency>
<dependency>
<groupId>
org.mapstruct
</groupId>
<artifactId>
mapstruct-jdk8
</artifactId>
<version>
${mapstruct.version}
</version>
</dependency>
<dependency>
<groupId>
org.mapstruct
</groupId>
<artifactId>
mapstruct-processor
</artifactId>
<version>
${mapstruct.version}
</version>
</dependency>
<dependency>
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-starter-security
</artifactId>
<version>
${spring-cloud-security.version}
</version>
</dependency>
<dependency>
<groupId>
io.jsonwebtoken
</groupId>
<artifactId>
jjwt
</artifactId>
<version>
${jsonwebtoken-jjwt.version}
</version>
</dependency>
<dependency>
<groupId>
org.zalando
</groupId>
<artifactId>
problem-spring-web
</artifactId>
<version>
${zalando-problem-spring-web.version}
</version>
</dependency>
<dependency>
<groupId>
com.github.ben-manes.caffeine
</groupId>
<artifactId>
caffeine
</artifactId>
<version>
${caffeine-cache.version}
</version>
</dependency>
<dependency>
<groupId>
com.esotericsoftware
</groupId>
<artifactId>
kryo-shaded
</artifactId>
<version>
${kryo.version}
</version>
</dependency>
<dependency>
<groupId>
io.github.openfeign
</groupId>
<artifactId>
feign-httpclient
</artifactId>
<version>
${openfeign-httpclient.version}
</version>
</dependency>
<dependency>
<groupId>
com.baomidou
</groupId>
<artifactId>
jobs-spring-boot-starter
</artifactId>
<version>
${baomidou-jobs.version}
</version>
</dependency>
<dependency>
<groupId>
org.flowable
</groupId>
<artifactId>
flowable-json-converter
</artifactId>
<version>
${flowable-modeler.version}
</version>
</dependency>
<dependency>
<groupId>
org.flowable
</groupId>
<artifactId>
flowable-ui-modeler-conf
</artifactId>
<version>
${flowable-modeler.version}
</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
</dependency>
<!-- Spring Cloud -->
<dependency>
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-starter-openfeign
</artifactId>
</dependency>
<!-- Alibaba Nacos -->
<dependency>
<groupId>
com.alibaba.cloud
</groupId>
<artifactId>
spring-cloud-starter-alibaba-nacos-discovery
</artifactId>
</dependency>
<!-- Alibaba Sentinel -->
<dependency>
<groupId>
com.alibaba.cloud
</groupId>
<artifactId>
spring-cloud-starter-alibaba-sentinel
</artifactId>
<version>
${alibaba-sentinel.version}
</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>
org.projectlombok
</groupId>
<artifactId>
lombok
</artifactId>
</dependency>
<!-- Httpclient -->
<dependency>
<groupId>
org.apache.httpcomponents
</groupId>
<artifactId>
httpclient
</artifactId>
</dependency>
<!-- 阿里Druid数据源 -->
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
druid-spring-boot-starter
</artifactId>
</dependency>
<!-- H2内存库 -->
<dependency>
<groupId>
com.h2database
</groupId>
<artifactId>
h2
</artifactId>
</dependency>
<!-- eureka服务注册中心 -->
<dependency>
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-starter-netflix-eureka-client
</artifactId>
<version>
${eureka-client.version}
</version>
</dependency>
<!-- Oracle驱动包 -->
<dependency>
<groupId>
com.oracle.database.jdbc
</groupId>
<artifactId>
ojdbc8
</artifactId>
<version>
${oracle.version}
</version>
</dependency>
<dependency>
<groupId>
com.oracle.database.nls
</groupId>
<artifactId>
orai18n
</artifactId>
<version>
${oracle.version}
</version>
</dependency>
<!-- PostgreSQL驱动包 -->
<dependency>
<groupId>
org.postgresql
</groupId>
<artifactId>
postgresql
</artifactId>
<version>
${postgresql.version}
</version>
</dependency>
<!-- MySQL驱动包 -->
<dependency>
<groupId>
mysql
</groupId>
<artifactId>
mysql-connector-java
</artifactId>
</dependency>
<!-- mp动态数据源 -->
<dependency>
<groupId>
com.baomidou
</groupId>
<artifactId>
dynamic-datasource-spring-boot-starter
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.data
</groupId>
<artifactId>
spring-data-commons
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.security
</groupId>
<artifactId>
spring-security-core
</artifactId>
</dependency>
<dependency>
<groupId>
net.logstash.logback
</groupId>
<artifactId>
logstash-logback-encoder
</artifactId>
</dependency>
<dependency>
<groupId>
com.baomidou
</groupId>
<artifactId>
mybatis-plus-boot-starter
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-data-mongodb
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-starter-security
</artifactId>
</dependency>
<dependency>
<groupId>
io.jsonwebtoken
</groupId>
<artifactId>
jjwt
</artifactId>
</dependency>
<dependency>
<groupId>
org.zalando
</groupId>
<artifactId>
problem-spring-web
</artifactId>
</dependency>
<dependency>
<groupId>
com.github.ben-manes.caffeine
</groupId>
<artifactId>
caffeine
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-data-redis
</artifactId>
</dependency>
<dependency>
<groupId>
com.esotericsoftware
</groupId>
<artifactId>
kryo-shaded
</artifactId>
</dependency>
<dependency>
<groupId>
org.apache.commons
</groupId>
<artifactId>
commons-pool2
</artifactId>
</dependency>
<!-- Swagger2 -->
<dependency>
<groupId>
io.springfox
</groupId>
<artifactId>
springfox-swagger2
</artifactId>
</dependency>
<dependency>
<groupId>
io.springfox
</groupId>
<artifactId>
springfox-swagger-ui
</artifactId>
</dependency>
<dependency>
<groupId>
io.github.openfeign
</groupId>
<artifactId>
feign-httpclient
</artifactId>
</dependency>
<!-- drools -->
<dependency>
<groupId>
org.drools
</groupId>
<artifactId>
drools-compiler
</artifactId>
</dependency>
<dependency>
<groupId>
org.drools
</groupId>
<artifactId>
drools-core
</artifactId>
</dependency>
<dependency>
<groupId>
org.kie
</groupId>
<artifactId>
kie-spring
</artifactId>
</dependency>
<dependency>
<groupId>
org.kie
</groupId>
<artifactId>
kie-api
</artifactId>
</dependency>
<dependency>
<groupId>
org.flowable
</groupId>
<artifactId>
flowable-json-converter
</artifactId>
</dependency>
<dependency>
<groupId>
org.flowable
</groupId>
<artifactId>
flowable-ui-modeler-conf
</artifactId>
<exclusions>
<exclusion>
<groupId>
org.apache.logging.log4j
</groupId>
<artifactId>
log4j-slf4j-impl
</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<distributionManagement>
<repository>
<id>
ibzi5DeploymentRepo
</id>
<url>
http://172.16.150.220:8081/nexus/content/repositories/releases
</url>
</repository>
<snapshotRepository>
<id>
ibzi5DeploymentRepo
</id>
<url>
172.16.150.220:8081/nexus/content/repositories/snapshots
</url>
</snapshotRepository>
</distributionManagement>
<repositories>
<repository>
<id>
ibizmvnrepository
</id>
<name>
ibizmvnrepository
</name>
<url>
http://172.16.240.220:8081/nexus/content/groups/public/
</url>
<layout>
default
</layout>
<releases>
<enabled>
true
</enabled>
</releases>
<snapshots>
<enabled>
true
</enabled>
<updatePolicy>
always
</updatePolicy>
</snapshots>
</repository>
<repository>
<id>
aliyunmaven
</id>
<name>
阿里云公共仓库
</name>
<url>
https://maven.aliyun.com/repository/public/
</url>
<layout>
default
</layout>
<releases>
<enabled>
true
</enabled>
</releases>
<snapshots>
<enabled>
true
</enabled>
<updatePolicy>
always
</updatePolicy>
</snapshots>
</repository>
</repositories>
</project>
src/main/java/cn/ibizlab/util/annotation/Audit.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
annotation
;
import
java.lang.annotation.ElementType
;
import
java.lang.annotation.Retention
;
import
java.lang.annotation.RetentionPolicy
;
import
java.lang.annotation.Target
;
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Target
({
ElementType
.
FIELD
})
public
@interface
Audit
{
}
src/main/java/cn/ibizlab/util/annotation/DEField.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
annotation
;
import
cn.ibizlab.util.enums.DEFieldDefaultValueType
;
import
cn.ibizlab.util.enums.DEPredefinedFieldType
;
import
cn.ibizlab.util.enums.DupCheck
;
import
java.lang.annotation.ElementType
;
import
java.lang.annotation.Retention
;
import
java.lang.annotation.RetentionPolicy
;
import
java.lang.annotation.Target
;
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Target
({
ElementType
.
FIELD
})
public
@interface
DEField
{
/**
* 属性名称
* @return
*/
String
name
()
default
""
;
/**
* 属性名称
* @return
*/
String
value
()
default
""
;
/**
* 是否为数据主键
* @return
*/
boolean
isKeyField
()
default
false
;
/**
* 默认值
* @return
*/
String
defaultValue
()
default
""
;
/**
* 属性类型
* @return
*/
String
fieldType
()
default
""
;
/**
* 默认值类型
* @return
*/
DEFieldDefaultValueType
defaultValueType
()
default
DEFieldDefaultValueType
.
NONE
;
/**
* 预置属性类型
* @return
*/
DEPredefinedFieldType
preType
()
default
DEPredefinedFieldType
.
NONE
;
/**
* 逻辑删除有效值
* @return
*/
String
logicval
()
default
""
;
/**
* 逻辑删除无效值
* @return
*/
String
logicdelval
()
default
""
;
/**
* 代码表
* @return
*/
String
dict
()
default
""
;
/**
* 日期格式化
* @return
*/
String
format
()
default
""
;
/**
* 重复性检查
* @return
*/
DupCheck
dupCheck
()
default
DupCheck
.
NONE
;
/**
* 范围属性
*/
String
dupCheckField
()
default
""
;
}
src/main/java/cn/ibizlab/util/annotation/VersionCheck.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
annotation
;
import
java.lang.annotation.ElementType
;
import
java.lang.annotation.Retention
;
import
java.lang.annotation.RetentionPolicy
;
import
java.lang.annotation.Target
;
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Target
({
ElementType
.
METHOD
})
public
@interface
VersionCheck
{
String
entity
();
String
versionfield
();
}
src/main/java/cn/ibizlab/util/aspect/AuditAspect.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
aspect
;
import
lombok.SneakyThrows
;
import
cn.ibizlab.util.annotation.Audit
;
import
cn.ibizlab.util.domain.EntityBase
;
import
cn.ibizlab.util.helper.DEFieldCacheMap
;
import
cn.ibizlab.util.service.IBZDataAuditService
;
import
org.aspectj.lang.JoinPoint
;
import
org.aspectj.lang.ProceedingJoinPoint
;
import
org.aspectj.lang.annotation.AfterReturning
;
import
org.aspectj.lang.annotation.Around
;
import
org.aspectj.lang.annotation.Aspect
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.expression.EvaluationContext
;
import
org.springframework.expression.Expression
;
import
org.springframework.expression.ExpressionParser
;
import
org.springframework.expression.spel.standard.SpelExpressionParser
;
import
org.springframework.expression.spel.support.StandardEvaluationContext
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.util.StringUtils
;
import
org.springframework.web.context.request.RequestAttributes
;
import
org.springframework.web.context.request.RequestContextHolder
;
import
org.springframework.web.context.request.ServletRequestAttributes
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.Map
;
/**
* 实体数据审计切面类
*/
@Aspect
@Component
public
class
AuditAspect
{
private
final
ExpressionParser
parser
=
new
SpelExpressionParser
();
@Autowired
IBZDataAuditService
dataAuditService
;
/**
* 实体数据建立切面,在成功创建数据后将新增数据内容记录审计日志内(审计明细【AuditInfo】中只记录审计属性变化情况,审计属性在平台属性中配置)
* @param point
*/
@AfterReturning
(
value
=
"execution(* cn.ibizlab.core.*.service.*.create(..))"
)
@SneakyThrows
public
void
create
(
JoinPoint
point
)
{
HttpServletRequest
request
=
null
;
RequestAttributes
requestAttributes
=
RequestContextHolder
.
getRequestAttributes
();
if
(
requestAttributes
!=
null
)
{
request
=
((
ServletRequestAttributes
)
requestAttributes
).
getRequest
();
}
Object
[]
args
=
point
.
getArgs
();
if
(
ObjectUtils
.
isEmpty
(
args
)
||
args
.
length
==
0
)
{
return
;
}
Object
serviceParam
=
args
[
0
];
if
(
serviceParam
instanceof
EntityBase
)
{
EntityBase
entity
=
(
EntityBase
)
serviceParam
;
Map
<
String
,
Audit
>
auditFields
=
DEFieldCacheMap
.
getAuditFields
(
entity
.
getClass
());
//是否有审计属性
if
(
auditFields
.
size
()==
0
)
{
return
;
}
String
idField
=
DEFieldCacheMap
.
getDEKeyField
(
entity
.
getClass
());
Object
idValue
=
""
;
if
(!
StringUtils
.
isEmpty
(
idField
))
{
idValue
=
entity
.
get
(
idField
);
}
//记录审计日志
dataAuditService
.
createAudit
(
request
,
entity
,
idValue
,
auditFields
);
}
}
/**
* 实体数据更新切面,在成功更新数据后将新增数据内容记录审计日志内(审计明细【AuditInfo】中只记录审计属性变化情况,审计属性在平台属性中配置)
* 使用环切【@Around】获取到更新前后的实体数据并进行差异比较,并将差异内容记入审计日志内
* @param point
*/
@Around
(
"execution(* cn.ibizlab.core.*.service.*.update(..))"
)
public
Object
update
(
ProceedingJoinPoint
point
)
throws
Throwable
{
HttpServletRequest
request
=
null
;
RequestAttributes
requestAttributes
=
RequestContextHolder
.
getRequestAttributes
();
if
(
requestAttributes
!=
null
)
{
request
=((
ServletRequestAttributes
)
requestAttributes
).
getRequest
();
}
Object
serviceObj
=
point
.
getTarget
();
Object
args
[]
=
point
.
getArgs
();
if
(
ObjectUtils
.
isEmpty
(
args
)
||
args
.
length
==
0
)
{
return
point
.
proceed
();
}
Object
arg
=
args
[
0
];
if
(
arg
instanceof
EntityBase
)
{
EntityBase
entity
=
(
EntityBase
)
arg
;
Map
<
String
,
Audit
>
auditFields
=
DEFieldCacheMap
.
getAuditFields
(
entity
.
getClass
());
//是否有审计属性
if
(
auditFields
.
size
()==
0
)
{
return
point
.
proceed
();
}
String
idField
=
DEFieldCacheMap
.
getDEKeyField
(
entity
.
getClass
());
Object
idValue
=
""
;
if
(!
StringUtils
.
isEmpty
(
idField
)){
idValue
=
entity
.
get
(
idField
);
}
if
(
ObjectUtils
.
isEmpty
(
idValue
))
{
return
point
.
proceed
();
}
//获取更新前实体
EntityBase
beforeEntity
=
getEntity
(
serviceObj
,
idValue
);
//执行更新操作
point
.
proceed
();
//记录审计日志
dataAuditService
.
updateAudit
(
request
,
beforeEntity
,
serviceObj
,
idValue
,
auditFields
);
return
true
;
}
return
point
.
proceed
();
}
/**
* 实体数据更新切面,在成功更新数据后将新增数据内容记录审计日志内(审计明细【AuditInfo】中只记录审计属性变化情况,审计属性在平台属性中配置)
* 使用环切【@Around】获取要删除的完整数据,并将审计属性相关信息记录到审计日志中
* @param point
* @return
* @throws Throwable
*/
@Around
(
"execution(* cn.ibizlab.core.*.service.*.remove(..))"
)
public
Object
remove
(
ProceedingJoinPoint
point
)
throws
Throwable
{
HttpServletRequest
request
=
null
;
RequestAttributes
requestAttributes
=
RequestContextHolder
.
getRequestAttributes
();
if
(
requestAttributes
!=
null
)
{
request
=
((
ServletRequestAttributes
)
requestAttributes
).
getRequest
();
}
Object
serviceObj
=
point
.
getTarget
();
Object
args
[]
=
point
.
getArgs
();
if
(
ObjectUtils
.
isEmpty
(
args
)
||
args
.
length
==
0
)
{
return
point
.
proceed
();
}
Object
idValue
=
args
[
0
];
EntityBase
entity
=
getEntity
(
serviceObj
,
idValue
);
Map
<
String
,
Audit
>
auditFields
=
DEFieldCacheMap
.
getAuditFields
(
entity
.
getClass
());
if
(
auditFields
.
size
()==
0
)
{
return
point
.
proceed
();
}
else
{
//执行删除操作
point
.
proceed
();
//记录审计日志
dataAuditService
.
removeAudit
(
request
,
entity
,
idValue
,
auditFields
);
return
true
;
}
}
/**
* 获取实体
* @param service
* @param id
* @return
*/
@SneakyThrows
private
EntityBase
getEntity
(
Object
service
,
Object
id
)
{
EntityBase
entity
=
null
;
if
(!
ObjectUtils
.
isEmpty
(
service
))
{
EvaluationContext
oldContext
=
new
StandardEvaluationContext
();
oldContext
.
setVariable
(
"service"
,
service
);
oldContext
.
setVariable
(
"id"
,
id
);
Expression
oldExp
=
parser
.
parseExpression
(
"#service.get(#id)"
);
return
oldExp
.
getValue
(
oldContext
,
EntityBase
.
class
);
}
return
entity
;
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/aspect/DEFieldDefaultValueAspect.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
aspect
;
import
cn.ibizlab.util.annotation.DEField
;
import
cn.ibizlab.util.domain.EntityBase
;
import
cn.ibizlab.util.enums.DEFieldDefaultValueType
;
import
cn.ibizlab.util.enums.DEPredefinedFieldType
;
import
cn.ibizlab.util.helper.DEFieldCacheMap
;
import
cn.ibizlab.util.security.AuthenticationUser
;
import
org.aspectj.lang.JoinPoint
;
import
org.aspectj.lang.annotation.Aspect
;
import
org.aspectj.lang.annotation.Before
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.AlternativeJdkIdGenerator
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.util.StringUtils
;
import
java.sql.Timestamp
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Map
;
/**
* 实体属性默认值切面,只有新建(Create)时才会填充默认值
*/
@Aspect
@Order
(
50
)
@Component
public
class
DEFieldDefaultValueAspect
{
/**
* 操作用户标识
*/
final
static
String
TAG_PERSONID
=
"SRF_PERSONID"
;
/**
* 操作用户名称
*/
final
static
String
TAG_PERSONNAME
=
"SRF_PERSONNAME"
;
/**
* 新建数据切入点
* @param point
* @throws Exception
*/
@Before
(
value
=
"execution(* cn.ibizlab.core.*.service.*.create(..))"
)
public
void
BeforeCreate
(
JoinPoint
point
)
throws
Exception
{
fillDEFieldDefaultValue
(
point
);
}
@Before
(
value
=
"execution(* cn.ibizlab.core.*.service.*.createBatch(..))"
)
public
void
BeforeCreateBatch
(
JoinPoint
point
)
throws
Exception
{
fillDEFieldDefaultValue
(
point
);
}
/**
* 更新数据切入点
* @param point
* @throws Exception
*/
@Before
(
value
=
"execution(* cn.ibizlab.core.*.service.*.update(..))"
)
public
void
BeforeUpdate
(
JoinPoint
point
)
throws
Exception
{
fillDEFieldDefaultValue
(
point
);
}
@Before
(
value
=
"execution(* cn.ibizlab.core.*.service.*.updateBatch(..))"
)
public
void
BeforeUpdateBatch
(
JoinPoint
point
)
throws
Exception
{
fillDEFieldDefaultValue
(
point
);
}
/**
* 保存数据切入点
* @param point
* @throws Exception
*/
@Before
(
value
=
"execution(* cn.ibizlab.core.*.service.*.save(..))"
)
public
void
BeforeSave
(
JoinPoint
point
)
throws
Exception
{
fillDEFieldDefaultValue
(
point
);
}
@Before
(
value
=
"execution(* cn.ibizlab.core.*.service.*.saveBatch(..))"
)
public
void
BeforeSaveBatch
(
JoinPoint
point
)
throws
Exception
{
fillDEFieldDefaultValue
(
point
);
}
/**
* 填充属性默认值
* @param joinPoint
* @return
* @throws Exception
*/
public
Object
fillDEFieldDefaultValue
(
JoinPoint
joinPoint
)
throws
Exception
{
Object
[]
args
=
joinPoint
.
getArgs
();
if
(
args
.
length
>
0
)
{
Object
obj
=
args
[
0
];
String
actionName
=
joinPoint
.
getSignature
().
getName
();
if
(
obj
instanceof
EntityBase
)
{
Map
<
String
,
DEField
>
deFields
=
DEFieldCacheMap
.
getDEFields
(
obj
.
getClass
());
AuthenticationUser
curUser
=
AuthenticationUser
.
getAuthenticationUser
();
String
keyField
=
DEFieldCacheMap
.
getDEKeyField
(
obj
.
getClass
());
if
(
StringUtils
.
isEmpty
(
keyField
))
{
return
true
;
}
fillDEField
((
EntityBase
)
obj
,
deFields
,
actionName
,
curUser
,
keyField
);
}
else
if
(
obj
instanceof
List
)
{
Map
<
String
,
DEField
>
deFields
=
null
;
AuthenticationUser
curUser
=
null
;
String
keyField
=
""
;
for
(
Object
item
:
(
List
)
obj
)
{
if
(
item
instanceof
EntityBase
)
{
if
(
deFields
==
null
)
{
deFields
=
DEFieldCacheMap
.
getDEFields
(
item
.
getClass
());
curUser
=
AuthenticationUser
.
getAuthenticationUser
();
keyField
=
DEFieldCacheMap
.
getDEKeyField
(
item
.
getClass
());
if
(
StringUtils
.
isEmpty
(
keyField
))
{
return
true
;
}
}
fillDEField
((
EntityBase
)
item
,
deFields
,
actionName
,
curUser
,
keyField
);
}
}
}
}
return
true
;
}
/**
* 填充系统预置属性
* @param et 当前实体对象
*/
private
void
fillDEField
(
EntityBase
et
,
Map
<
String
,
DEField
>
deFields
,
String
actionName
,
AuthenticationUser
curUser
,
String
keyField
)
throws
Exception
{
if
(
deFields
.
size
()==
0
)
{
return
;
}
if
(
actionName
.
toLowerCase
().
startsWith
(
"save"
))
{
if
(
ObjectUtils
.
isEmpty
(
et
.
get
(
keyField
)))
{
actionName
=
"create"
;
}
}
for
(
Map
.
Entry
<
String
,
DEField
>
entry
:
deFields
.
entrySet
())
{
String
fieldname
=
entry
.
getKey
();
//获取注解
DEField
fieldAnnotation
=
entry
.
getValue
();
//获取默认值类型
DEFieldDefaultValueType
deFieldType
=
fieldAnnotation
.
defaultValueType
();
//获取属性默认值
String
deFieldDefaultValue
=
fieldAnnotation
.
defaultValue
();
//获取预置属性类型
DEPredefinedFieldType
predefinedFieldType
=
fieldAnnotation
.
preType
();
//填充系统默认值
if
(
actionName
.
toLowerCase
().
startsWith
(
"create"
)
&&
(
deFieldType
!=
DEFieldDefaultValueType
.
NONE
||
(!
StringUtils
.
isEmpty
(
deFieldDefaultValue
))))
{
fillFieldDefaultValue
(
fieldname
,
deFieldType
,
deFieldDefaultValue
,
et
,
curUser
)
;
}
//填充系统预置属性
if
(
predefinedFieldType
!=
DEPredefinedFieldType
.
NONE
)
{
fillPreFieldValue
(
fieldname
,
predefinedFieldType
,
et
,
actionName
,
fieldAnnotation
.
logicval
(),
curUser
);
}
}
}
/**
* 填充属性默认值
* @param fieldname 实体属性名
* @param deFieldType 默认值类型
* @param deFieldDefaultValue 默认值
* @param et 当前实体对象
* @throws Exception
*/
private
void
fillFieldDefaultValue
(
String
fieldname
,
DEFieldDefaultValueType
deFieldType
,
String
deFieldDefaultValue
,
EntityBase
et
,
AuthenticationUser
curUser
)
throws
Exception
{
Object
fieldValue
=
et
.
get
(
fieldname
);
if
(
org
.
springframework
.
util
.
ObjectUtils
.
isEmpty
(
fieldValue
))
{
//填充直接值及其余默认值类型
if
(
(
deFieldType
==
DEFieldDefaultValueType
.
NONE
&&
!
StringUtils
.
isEmpty
(
deFieldDefaultValue
))
||
(
deFieldType
!=
DEFieldDefaultValueType
.
NONE
))
{
switch
(
deFieldType
)
{
case
SESSION:
if
(!
StringUtils
.
isEmpty
(
deFieldDefaultValue
))
{
Object
sessionFieldValue
=
curUser
.
getSessionParams
().
get
(
deFieldDefaultValue
.
toLowerCase
());
if
(!
ObjectUtils
.
isEmpty
(
sessionFieldValue
))
{
et
.
set
(
fieldname
,
sessionFieldValue
);
}
}
break
;
case
APPLICATION:
//暂未实现
break
;
case
UNIQUEID:
et
.
set
(
fieldname
,
(
new
AlternativeJdkIdGenerator
()).
generateId
().
toString
().
replace
(
"-"
,
""
));
break
;
case
CONTEXT:
if
(!
StringUtils
.
isEmpty
(
deFieldDefaultValue
))
{
Object
paramFieldValue
=
et
.
get
(
deFieldDefaultValue
);
if
(!
ObjectUtils
.
isEmpty
(
paramFieldValue
))
{
et
.
set
(
fieldname
,
paramFieldValue
);
}
}
break
;
case
PARAM:
if
(!
StringUtils
.
isEmpty
(
deFieldDefaultValue
))
{
Object
paramFieldValue
=
et
.
get
(
deFieldDefaultValue
);
if
(!
ObjectUtils
.
isEmpty
(
paramFieldValue
))
{
et
.
set
(
fieldname
,
paramFieldValue
);
}
}
break
;
case
OPERATOR:
et
.
set
(
fieldname
,
curUser
.
getUserid
());
break
;
case
OPERATORNAME:
et
.
set
(
fieldname
,
curUser
.
getPersonname
());
break
;
case
CURTIME:
et
.
set
(
fieldname
,
new
Timestamp
(
new
Date
().
getTime
()));
break
;
case
APPDATA:
//暂未实现
break
;
case
NONE:
et
.
set
(
fieldname
,
deFieldDefaultValue
);
break
;
}
}
}
}
private
void
fillPreFieldValue
(
String
fieldname
,
DEPredefinedFieldType
preFieldType
,
EntityBase
et
,
String
actionName
,
String
logicValue
,
AuthenticationUser
curUser
)
throws
Exception
{
Object
fieldValue
=
et
.
get
(
fieldname
);
//为预置属性进行赋值
if
(
actionName
.
toLowerCase
().
startsWith
(
"create"
)
||
preFieldType
==
DEPredefinedFieldType
.
UPDATEDATE
||
preFieldType
==
DEPredefinedFieldType
.
UPDATEMAN
||
preFieldType
==
DEPredefinedFieldType
.
UPDATEMANNAME
)
{
switch
(
preFieldType
)
{
case
CREATEMAN:
et
.
set
(
fieldname
,
StringUtils
.
isEmpty
(
curUser
.
getUserid
())
?
et
.
get
(
TAG_PERSONID
)
:
curUser
.
getUserid
());
break
;
case
CREATEMANNAME:
et
.
set
(
fieldname
,
StringUtils
.
isEmpty
(
curUser
.
getPersonname
())
?
et
.
get
(
TAG_PERSONNAME
)
:
curUser
.
getPersonname
());
break
;
case
UPDATEMAN:
et
.
set
(
fieldname
,
StringUtils
.
isEmpty
(
curUser
.
getUserid
())
?
et
.
get
(
TAG_PERSONID
)
:
curUser
.
getUserid
());
break
;
case
UPDATEMANNAME:
et
.
set
(
fieldname
,
StringUtils
.
isEmpty
(
curUser
.
getPersonname
())
?
et
.
get
(
TAG_PERSONNAME
)
:
curUser
.
getPersonname
());
break
;
case
CREATEDATE:
et
.
set
(
fieldname
,
new
Timestamp
(
new
Date
().
getTime
()));
break
;
case
UPDATEDATE:
et
.
set
(
fieldname
,
new
Timestamp
(
new
Date
().
getTime
()));
break
;
case
ORGID:
if
(
org
.
springframework
.
util
.
StringUtils
.
isEmpty
(
fieldValue
))
{
et
.
set
(
fieldname
,
curUser
.
getOrgid
());
}
break
;
case
ORGNAME:
if
(
org
.
springframework
.
util
.
StringUtils
.
isEmpty
(
fieldValue
))
{
et
.
set
(
fieldname
,
curUser
.
getOrgname
());
}
break
;
case
ORGSECTORID:
if
(
org
.
springframework
.
util
.
StringUtils
.
isEmpty
(
fieldValue
))
{
et
.
set
(
fieldname
,
curUser
.
getMdeptid
());
}
break
;
case
ORGSECTORNAME:
if
(
org
.
springframework
.
util
.
StringUtils
.
isEmpty
(
fieldValue
))
{
et
.
set
(
fieldname
,
curUser
.
getMdeptname
());
}
break
;
case
LOGICVALID:
if
(
StringUtils
.
isEmpty
(
logicValue
))
{
logicValue
=
"1"
;
}
et
.
set
(
fieldname
,
logicValue
);
break
;
}
}
}
}
src/main/java/cn/ibizlab/util/aspect/DELogicAspect.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
aspect
;
import
lombok.extern.slf4j.Slf4j
;
import
cn.ibizlab.util.domain.DELogic
;
import
cn.ibizlab.util.domain.EntityBase
;
import
cn.ibizlab.util.errors.BadRequestAlertException
;
import
cn.ibizlab.util.helper.DEFieldCacheMap
;
import
org.apache.commons.io.IOUtils
;
import
org.aspectj.lang.ProceedingJoinPoint
;
import
org.aspectj.lang.annotation.Around
;
import
org.aspectj.lang.annotation.Aspect
;
import
org.flowable.bpmn.converter.BpmnXMLConverter
;
import
org.flowable.bpmn.model.*
;
import
org.flowable.bpmn.model.Process
;
import
org.kie.api.KieServices
;
import
org.kie.api.builder.KieBuilder
;
import
org.kie.api.builder.KieFileSystem
;
import
org.kie.api.builder.Message
;
import
org.kie.api.builder.Results
;
import
org.kie.api.runtime.KieContainer
;
import
org.kie.api.runtime.KieSession
;
import
org.kie.internal.io.ResourceFactory
;
import
org.springframework.core.io.ClassPathResource
;
import
org.springframework.core.io.Resource
;
import
org.springframework.expression.EvaluationContext
;
import
org.springframework.expression.Expression
;
import
org.springframework.expression.ExpressionParser
;
import
org.springframework.expression.spel.standard.SpelExpressionParser
;
import
org.springframework.expression.spel.support.StandardEvaluationContext
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ClassUtils
;
import
org.springframework.util.DigestUtils
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.util.StringUtils
;
import
org.springframework.core.annotation.Order
;
import
javax.xml.stream.XMLInputFactory
;
import
javax.xml.stream.XMLStreamReader
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.lang.reflect.Method
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.ConcurrentMap
;
/**
* 实体处理逻辑切面(前后附加逻辑、实体行为调用处理逻辑)
*/
@Aspect
@Component
@Slf4j
@Order
(
100
)
public
class
DELogicAspect
{
private
static
BpmnXMLConverter
bpmnXMLConverter
=
new
BpmnXMLConverter
();
private
final
ExpressionParser
parser
=
new
SpelExpressionParser
();
private
ConcurrentMap
<
String
,
DELogic
>
deLogicMap
=
new
ConcurrentHashMap
<>();
private
static
Map
<
String
,
Object
>
validLogic
=
new
HashMap
<>();
/**
* 执行实体行为附加逻辑、实体行为调用处理逻辑
*
* @param point
* @return
* @throws Throwable
*/
@Around
(
"execution(* cn.ibizlab.core.*.service.*.*(..)) && !execution(* cn.ibizlab.core.es.service.*.*(..))"
)
public
Object
executeLogic
(
ProceedingJoinPoint
point
)
throws
Throwable
{
Object
args
[]
=
point
.
getArgs
();
if
(
ObjectUtils
.
isEmpty
(
args
)
||
args
.
length
==
0
)
{
return
point
.
proceed
();
}
Object
service
=
point
.
getTarget
();
Object
arg
=
args
[
0
];
String
action
=
point
.
getSignature
().
getName
();
EntityBase
entity
=
null
;
if
(
"remove"
.
equalsIgnoreCase
(
action
)
||
"get"
.
equalsIgnoreCase
(
action
))
{
entity
=
getEntity
(
service
.
getClass
());
if
(!
ObjectUtils
.
isEmpty
(
entity
))
{
String
id
=
DEFieldCacheMap
.
getDEKeyField
(
entity
.
getClass
());
if
(
StringUtils
.
isEmpty
(
id
))
{
log
.
debug
(
"无法获取实体主键属性[{}]"
,
getEntityName
(
entity
));
return
point
.
proceed
();
}
entity
.
set
(
id
,
arg
);
}
}
else
if
(
arg
instanceof
EntityBase
)
{
entity
=
(
EntityBase
)
arg
;
}
if
(
entity
!=
null
)
{
executeBeforeLogic
(
entity
,
action
);
Object
result
=
point
.
proceed
();
if
(
"get"
.
equalsIgnoreCase
(
action
)
&&
result
instanceof
EntityBase
){
entity
=
(
EntityBase
)
result
;
}
executeLogic
(
entity
,
action
);
executeAfterLogic
(
entity
,
action
);
return
result
;
}
return
point
.
proceed
();
}
/**
* 判断类是否被代理类代理
*/
private
String
getEntityName
(
Object
entity
){
String
entityName
=
entity
.
getClass
().
getSimpleName
();
if
(
entityName
.
contains
(
"$$"
)){
entityName
=
ClassUtils
.
getUserClass
(
entity
.
getClass
()).
getSimpleName
();
}
return
entityName
;
}
/**
* 前附加逻辑
*
* @param entity
* @param action
*/
private
void
executeBeforeLogic
(
EntityBase
entity
,
String
action
)
{
Resource
bpmnFile
=
getLocalModel
(
getEntityName
(
entity
),
action
,
LogicExecMode
.
BEFORE
);
if
(
bpmnFile
!=
null
&&
bpmnFile
.
exists
()
&&
isValid
(
bpmnFile
,
entity
,
action
))
{
executeLogic
(
bpmnFile
,
entity
,
action
);
}
}
/**
* 后附加逻辑
*
* @param entity
* @param action
*/
private
void
executeAfterLogic
(
EntityBase
entity
,
String
action
)
{
Resource
bpmnFile
=
getLocalModel
(
getEntityName
(
entity
),
action
,
LogicExecMode
.
AFTER
);
if
(
bpmnFile
!=
null
&&
bpmnFile
.
exists
()
&&
isValid
(
bpmnFile
,
entity
,
action
))
{
executeLogic
(
bpmnFile
,
entity
,
action
);
}
}
/**
* 实体行为调用处理逻辑
*
* @param entity
* @param action
*/
private
void
executeLogic
(
EntityBase
entity
,
String
action
)
{
Resource
bpmnFile
=
getLocalModel
(
getEntityName
(
entity
),
action
,
LogicExecMode
.
EXEC
);
if
(
bpmnFile
!=
null
&&
bpmnFile
.
exists
()
&&
isValid
(
bpmnFile
,
entity
,
action
))
{
executeLogic
(
bpmnFile
,
entity
,
action
);
}
}
/**
* 编译并执行规则(bpmn、drl)
*
* @param bpmnFile
* @param entity
*/
private
void
executeLogic
(
Resource
bpmnFile
,
Object
entity
,
String
action
)
{
try
{
log
.
debug
(
"开始执行实体处理逻辑[{}:{}:{}:本地模式]"
,
getEntityName
(
entity
),
action
,
bpmnFile
.
getFilename
());
String
bpmnId
=
DigestUtils
.
md5DigestAsHex
(
bpmnFile
.
getURL
().
getPath
().
getBytes
());
DELogic
logic
=
getDELogic
(
bpmnFile
);
if
(
logic
==
null
)
{
return
;
}
if
(
deLogicMap
.
containsKey
(
bpmnId
)
&&
logic
.
getMd5
().
equals
(
deLogicMap
.
get
(
bpmnId
).
getMd5
()))
{
logic
=
deLogicMap
.
get
(
bpmnId
);
}
else
{
reloadLogic
(
logic
);
deLogicMap
.
put
(
bpmnId
,
logic
);
}
KieContainer
container
=
logic
.
getContainer
();
KieSession
kieSession
=
container
.
getKieBase
().
newKieSession
();
Process
mainProcess
=
logic
.
getProcess
();
//主流程参数
fillGlobalParam
(
kieSession
,
mainProcess
,
entity
);
//子流程参数
if
(!
ObjectUtils
.
isEmpty
(
logic
.
getRefLogic
()))
{
for
(
DELogic
subLogic
:
logic
.
getRefLogic
())
{
fillGlobalParam
(
kieSession
,
subLogic
.
getProcess
(),
entity
);
}
}
kieSession
.
startProcess
(
mainProcess
.
getId
());
log
.
debug
(
"实体处理逻辑[{}:{}:{}:本地模式]执行结束"
,
getEntityName
(
entity
),
action
,
bpmnFile
.
getFilename
());
}
catch
(
Exception
e
)
{
log
.
error
(
"实体处理逻辑[{}:{}:{}:本地模式]发生异常"
,
getEntityName
(
entity
),
action
,
bpmnFile
.
getFilename
());
throw
new
BadRequestAlertException
(
"执行实体处理逻辑发生异常"
+
e
.
getMessage
(),
"DELogicAspect"
,
"executeLogic"
);
}
}
/**
* 编译规则
*
* @param logic
*/
private
void
reloadLogic
(
DELogic
logic
)
throws
IOException
{
KieServices
kieServices
=
KieServices
.
get
();
KieFileSystem
kieFileSystem
=
kieServices
.
newKieFileSystem
();
for
(
Resource
bpmn
:
logic
.
getRefRuleFiles
())
{
kieFileSystem
.
write
(
ResourceFactory
.
newUrlResource
(
bpmn
.
getURL
()));
}
KieBuilder
kieBuilder
=
kieServices
.
newKieBuilder
(
kieFileSystem
).
buildAll
();
Results
results
=
kieBuilder
.
getResults
();
if
(
results
.
hasMessages
(
Message
.
Level
.
ERROR
))
{
throw
new
BadRequestAlertException
(
String
.
format
(
"编译实体处理逻辑 [%s] 发生异常, %s"
,
logic
.
getName
(),
results
.
getMessages
()),
"DELogicAspect"
,
"reloadLogic"
);
}
KieContainer
kieContainer
=
kieServices
.
newKieContainer
(
kieServices
.
getRepository
().
getDefaultReleaseId
());
logic
.
setContainer
(
kieContainer
);
}
/**
* 填充逻辑参数
*
* @param kieSession
* @param process
* @param entity
*/
private
void
fillGlobalParam
(
KieSession
kieSession
,
Process
process
,
Object
entity
)
{
Map
<
String
,
List
<
ExtensionElement
>>
params
=
process
.
getExtensionElements
();
for
(
Map
.
Entry
<
String
,
List
<
ExtensionElement
>>
param
:
params
.
entrySet
())
{
if
(
"metaData"
.
equalsIgnoreCase
(
param
.
getKey
()))
{
List
<
ExtensionElement
>
globalParams
=
param
.
getValue
();
for
(
ExtensionElement
globalParam
:
globalParams
)
{
Object
value
=
null
;
Map
<
String
,
List
<
ExtensionAttribute
>>
globalParamAttr
=
globalParam
.
getAttributes
();
if
(
globalParamAttr
.
containsKey
(
"name"
)
&&
globalParamAttr
.
containsKey
(
"type"
)
&&
globalParamAttr
.
containsKey
(
"express"
))
{
ExtensionAttribute
name
=
globalParamAttr
.
get
(
"name"
).
get
(
0
);
ExtensionAttribute
type
=
globalParamAttr
.
get
(
"type"
).
get
(
0
);
ExtensionAttribute
express
=
globalParamAttr
.
get
(
"express"
).
get
(
0
);
String
express_value
=
express
.
getValue
();
EvaluationContext
oldContext
=
new
StandardEvaluationContext
();
if
(
"entity"
.
equalsIgnoreCase
(
type
.
getValue
()))
{
value
=
entity
;
}
if
(!
ObjectUtils
.
isEmpty
(
type
.
getValue
())
&&
ObjectUtils
.
isEmpty
(
value
))
{
Expression
oldExp
=
parser
.
parseExpression
(
express_value
);
value
=
oldExp
.
getValue
(
oldContext
);
}
if
(
"entity"
.
equalsIgnoreCase
(
type
.
getValue
())
||
"refentity"
.
equalsIgnoreCase
(
type
.
getValue
()))
{
kieSession
.
insert
(
value
);
}
kieSession
.
setGlobal
(
name
.
getValue
(),
value
);
}
}
}
}
}
/**
* 获取逻辑配置
*
* @param bpmnFile
* @return
*/
private
DELogic
getDELogic
(
Resource
bpmnFile
)
{
DELogic
logic
=
null
;
XMLStreamReader
reader
=
null
;
InputStream
bpmn
=
null
;
try
{
if
(
bpmnFile
.
exists
())
{
XMLInputFactory
factory
=
XMLInputFactory
.
newInstance
();
bpmn
=
bpmnFile
.
getInputStream
();
reader
=
factory
.
createXMLStreamReader
(
bpmn
);
BpmnModel
model
=
bpmnXMLConverter
.
convertToBpmnModel
(
reader
);
Process
mainProcess
=
model
.
getMainProcess
();
if
(
mainProcess
==
null
)
{
return
null
;
}
log
.
debug
(
"正在加载 BPMN:{}"
,
bpmnFile
.
getURL
().
getPath
());
List
<
DELogic
>
refLogics
=
new
ArrayList
<>();
List
<
Resource
>
refFiles
=
new
ArrayList
<>();
//自己 bpmn 及 drl
refFiles
.
add
(
bpmnFile
);
Resource
drlFile
=
getDrl
(
bpmnFile
);
if
(
drlFile
!=
null
&&
drlFile
.
exists
())
{
refFiles
.
add
(
drlFile
);
log
.
debug
(
"正在加载 DRL:{}"
,
drlFile
.
getURL
().
getPath
());
}
//子 bpmn 及 drl
if
(!
ObjectUtils
.
isEmpty
(
model
.
getMainProcess
())
&&
!
ObjectUtils
.
isEmpty
(
model
.
getMainProcess
().
getFlowElementMap
()))
{
model
.
getMainProcess
().
getFlowElementMap
().
values
().
forEach
(
item
->
{
if
(
item
instanceof
CallActivity
)
{
CallActivity
subBpmn
=
(
CallActivity
)
item
;
String
bpmnFileName
=
subBpmn
.
getName
();
Resource
subBpmnFile
=
getSubBpmn
(
bpmnFileName
);
DELogic
refLogic
=
getDELogic
(
subBpmnFile
);
if
(
refLogic
!=
null
)
{
refLogics
.
add
(
refLogic
);
if
(!
ObjectUtils
.
isEmpty
(
refLogic
.
getRefRuleFiles
()))
{
refFiles
.
addAll
(
refLogic
.
getRefRuleFiles
());
}
}
}
});
}
logic
=
new
DELogic
();
logic
.
setId
(
mainProcess
.
getId
());
logic
.
setName
(
mainProcess
.
getName
());
logic
.
setProcess
(
mainProcess
);
logic
.
setRefLogic
(
refLogics
);
logic
.
setRefRuleFiles
(
refFiles
);
logic
.
setMd5
(
getMd5
(
refFiles
));
}
}
catch
(
Exception
e
)
{
log
.
error
(
"执行处理逻辑失败"
+
e
);
}
finally
{
try
{
if
(
reader
!=
null
)
{
reader
.
close
();
}
if
(
bpmn
!=
null
)
{
bpmn
.
close
();
}
}
catch
(
Exception
e
)
{
log
.
error
(
"执行处理逻辑失败"
+
e
);
}
}
return
logic
;
}
/**
* 获取实体
*
* @param service
* @return
*/
private
EntityBase
getEntity
(
Class
service
)
{
Method
[]
methods
=
service
.
getDeclaredMethods
();
for
(
Method
method
:
methods
)
{
for
(
Class
cls
:
method
.
getParameterTypes
())
{
try
{
Object
arg
=
cls
.
newInstance
();
if
(
arg
instanceof
EntityBase
)
{
return
(
EntityBase
)
arg
;
}
}
catch
(
Exception
e
)
{
}
}
}
if
(!
ObjectUtils
.
isEmpty
(
service
.
getSuperclass
())
&&
!
service
.
getSuperclass
().
getName
().
equals
(
Object
.
class
.
getName
()))
{
return
getEntity
(
service
.
getSuperclass
());
}
log
.
error
(
"获取实体信息失败,未能在[{}]中找到参数为实体类对象的行为,如create.update等"
,
service
.
getSimpleName
());
return
null
;
}
/**
* 获取bpmn md5
*
* @param subFiles
* @return
*/
private
String
getMd5
(
List
<
Resource
>
subFiles
)
{
try
{
StringBuffer
buffer
=
new
StringBuffer
();
for
(
Resource
file
:
subFiles
)
{
InputStream
bpmnFile
=
null
;
try
{
bpmnFile
=
file
.
getInputStream
();
if
(!
ObjectUtils
.
isEmpty
(
bpmnFile
))
{
String
strBpmn
=
IOUtils
.
toString
(
bpmnFile
,
"UTF-8"
);
buffer
.
append
(
strBpmn
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"处理逻辑版本检查失败"
+
e
);
}
finally
{
if
(
bpmnFile
!=
null
)
{
bpmnFile
.
close
();
}
}
}
if
(!
StringUtils
.
isEmpty
(
buffer
.
toString
()))
{
return
DigestUtils
.
md5DigestAsHex
(
buffer
.
toString
().
getBytes
());
}
else
{
return
null
;
}
}
catch
(
Exception
e
)
{
log
.
error
(
"处理逻辑版本检查失败"
+
e
);
return
null
;
}
}
/**
* 本地逻辑
*
* @param entity
* @param action
* @param logicExecMode
* @return
*/
private
Resource
getLocalModel
(
String
entity
,
String
action
,
LogicExecMode
logicExecMode
)
{
return
new
ClassPathResource
(
"rules"
+
File
.
separator
+
entity
+
File
.
separator
+
action
.
toLowerCase
()
+
File
.
separator
+
logicExecMode
.
text
+
".bpmn"
);
}
/**
* 处理逻辑 bpmn
*
* @param logicName
* @return
*/
private
Resource
getSubBpmn
(
String
logicName
)
{
return
new
ClassPathResource
(
String
.
format
(
"rules/%s"
,
logicName
));
}
/**
* 处理逻辑 drl
*
* @param bpmn
* @return
*/
private
Resource
getDrl
(
Resource
bpmn
)
{
String
filePath
=
((
ClassPathResource
)
bpmn
).
getPath
();
filePath
=
filePath
.
endsWith
(
"RuleFlow.bpmn"
)
?
filePath
.
replace
(
"RuleFlow.bpmn"
,
"Rule.drl"
)
:
filePath
.
replace
(
".bpmn"
,
".drl"
);
return
new
ClassPathResource
(
filePath
);
}
/**
* 逻辑是否有效
*
* @param bpmn
* @param entity
* @param action
* @return
*/
private
boolean
isValid
(
Resource
bpmn
,
Object
entity
,
Object
action
)
{
String
logicId
=
String
.
format
(
"%s%s%s"
,
getEntityName
(
entity
),
action
,
bpmn
.
getFilename
()).
toLowerCase
();
if
(
validLogic
.
containsKey
(
logicId
))
{
return
true
;
}
else
{
return
false
;
}
}
static
{
}
public
enum
LogicExecMode
{
/**
* 前附加逻辑
*/
BEFORE
(
"0"
,
"before"
),
/**
* 后附加逻辑
*/
AFTER
(
"1"
,
"after"
),
/**
*
*/
EXEC
(
"2"
,
"exec"
);
LogicExecMode
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
private
String
value
;
private
String
text
;
}
}
src/main/java/cn/ibizlab/util/aspect/VersionCheckAspect.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
aspect
;
import
lombok.SneakyThrows
;
import
cn.ibizlab.util.annotation.VersionCheck
;
import
cn.ibizlab.util.domain.EntityBase
;
import
cn.ibizlab.util.errors.BadRequestAlertException
;
import
cn.ibizlab.util.helper.RuleUtils
;
import
org.aspectj.lang.JoinPoint
;
import
org.aspectj.lang.annotation.Aspect
;
import
org.aspectj.lang.annotation.Before
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.expression.EvaluationContext
;
import
org.springframework.expression.Expression
;
import
org.springframework.expression.ExpressionParser
;
import
org.springframework.expression.spel.standard.SpelExpressionParser
;
import
org.springframework.expression.spel.support.StandardEvaluationContext
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.util.StringUtils
;
import
java.lang.reflect.Field
;
import
java.sql.Timestamp
;
import
java.text.SimpleDateFormat
;
import
java.util.Date
;
import
java.util.Map
;
/**
* 数据库版本检查
*/
@Aspect
@Order
(
50
)
@Component
public
class
VersionCheckAspect
{
private
final
ExpressionParser
parser
=
new
SpelExpressionParser
();
private
final
String
IgnoreField
=
"ignoreversioncheck"
;
@SneakyThrows
@Before
(
"execution(* cn.ibizlab.*.rest.*.update(..)) && @annotation(versionCheck)"
)
public
void
BeforeUpdate
(
JoinPoint
point
,
VersionCheck
versionCheck
)
{
Object
[]
args
=
point
.
getArgs
();
Object
id
=
args
[
0
];
Object
dto
=
args
[
1
];
if
(
ObjectUtils
.
isEmpty
(
id
)
||
ObjectUtils
.
isEmpty
(
dto
))
{
return
;
}
String
versionField
=
versionCheck
.
versionfield
();
if
(
StringUtils
.
isEmpty
(
versionField
))
{
return
;
}
versionCheck
(
versionCheck
,
point
.
getTarget
(),
dto
,
id
);
}
@SneakyThrows
@Before
(
"execution(* cn.ibizlab.*.rest.*.updateBy*(..)) && @annotation(versionCheck)"
)
public
void
BeforeUpdateBy
(
JoinPoint
point
,
VersionCheck
versionCheck
)
{
Object
[]
args
=
point
.
getArgs
();
if
(
args
.
length
>=
2
)
{
Object
id
=
args
[
args
.
length
-
2
];
Object
dto
=
args
[
args
.
length
-
1
];
if
(
ObjectUtils
.
isEmpty
(
id
)
||
ObjectUtils
.
isEmpty
(
dto
))
{
return
;
}
String
versionField
=
versionCheck
.
versionfield
();
if
(
StringUtils
.
isEmpty
(
versionField
))
{
return
;
}
versionCheck
(
versionCheck
,
point
.
getTarget
(),
dto
,
id
);
}
}
private
void
versionCheck
(
VersionCheck
versionCheck
,
Object
resource
,
Object
dto
,
Object
id
)
{
EvaluationContext
context
=
new
StandardEvaluationContext
();
context
.
setVariable
(
"dto"
,
dto
);
//忽略版本检查
Expression
dtoParamsExp
=
parser
.
parseExpression
(
"#dto.extensionparams"
);
Map
dtoParam
=
dtoParamsExp
.
getValue
(
context
,
Map
.
class
);
if
(!
ObjectUtils
.
isEmpty
(
dtoParam
)
&&
!
ObjectUtils
.
isEmpty
(
dtoParam
.
get
(
IgnoreField
))
&&
dtoParam
.
get
(
IgnoreField
).
equals
(
1
))
{
return
;
}
Expression
newExp
=
parser
.
parseExpression
(
String
.
format
(
"#dto.%s"
,
versionCheck
.
versionfield
()));
Object
newVersion
=
newExp
.
getValue
(
context
);
if
(
ObjectUtils
.
isEmpty
(
newVersion
))
{
return
;
}
//进行版本检查
Object
oldVersion
=
getDBVersion
(
versionCheck
,
getService
(
resource
,
versionCheck
.
entity
()),
id
);
if
(!
ObjectUtils
.
isEmpty
(
oldVersion
))
{
if
(
RuleUtils
.
gt
(
newVersion
,
oldVersion
))
{
throw
new
BadRequestAlertException
(
"数据已变更,可能后台数据已被修改,请重新加载数据"
,
"VersionCheckAspect"
,
"versionCheck"
);
}
}
}
/**
* 获取实体服务对象
* @param resource
* @param entity
* @return
*/
@SneakyThrows
private
Object
getService
(
Object
resource
,
String
entity
)
{
Object
service
=
null
;
Field
[]
fields
=
resource
.
getClass
().
getDeclaredFields
();
for
(
Field
field
:
fields
)
{
if
(
field
.
getModifiers
()==
1
&&
field
.
getName
().
equalsIgnoreCase
(
String
.
format
(
"%sService"
,
entity
)))
{
service
=
field
.
get
(
resource
);
break
;
}
}
return
service
;
}
/**
* 获取数据库版本
* @param versionCheck
* @param service
* @param id
* @return
*/
@SneakyThrows
private
Object
getDBVersion
(
VersionCheck
versionCheck
,
Object
service
,
Object
id
)
{
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
Timestamp
dbVersion
=
null
;
String
versionField
=
versionCheck
.
versionfield
();
if
(!
ObjectUtils
.
isEmpty
(
service
))
{
EvaluationContext
oldContext
=
new
StandardEvaluationContext
();
oldContext
.
setVariable
(
"service"
,
service
);
oldContext
.
setVariable
(
"id"
,
id
);
Expression
oldExp
=
parser
.
parseExpression
(
"#service.get(#id)"
);
EntityBase
oldEntity
=
oldExp
.
getValue
(
oldContext
,
EntityBase
.
class
);
Object
oldDate
=
oldEntity
.
get
(
versionField
);
if
(
oldDate
!=
null
&&
oldDate
instanceof
Timestamp
)
{
Timestamp
db_time
=
(
Timestamp
)
oldDate
;
Date
db_date
=
sdf
.
parse
(
sdf
.
format
(
db_time
));
dbVersion
=
new
Timestamp
(
db_date
.
getTime
());
}
}
return
dbVersion
;
}
}
src/main/java/cn/ibizlab/util/cache/CaffeineCacheConfig.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
cache
;
import
com.github.benmanes.caffeine.cache.CaffeineSpec
;
import
org.springframework.boot.autoconfigure.cache.CacheProperties
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnExpression
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.cache.CacheManager
;
import
org.springframework.cache.annotation.EnableCaching
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.util.StringUtils
;
import
cn.ibizlab.util.cache.cacheManager.CaffeineCacheManager
;
/**
* Caffeine缓存配置类
*/
@EnableCaching
@Configuration
@EnableConfigurationProperties
(
CacheProperties
.
class
)
@ConditionalOnExpression
(
"'${ibiz.cacheLevel:None}'.equals('L1')"
)
public
class
CaffeineCacheConfig
{
/**
* Caffeine配置:设置过期时间
* @return
*/
@Bean
@Primary
public
CacheManager
cacheManager
(
CacheProperties
cacheProperties
)
{
CaffeineCacheManager
caffeineCacheManager
=
new
CaffeineCacheManager
();
String
strCacheConfig
=
cacheProperties
.
getCaffeine
().
getSpec
();
if
(
StringUtils
.
hasText
(
strCacheConfig
))
{
caffeineCacheManager
.
setCaffeineCacheConfig
(
CaffeineSpec
.
parse
(
strCacheConfig
));
}
return
caffeineCacheManager
;
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/cache/RedisCacheConfig.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
cache
;
import
com.fasterxml.jackson.annotation.JsonAutoDetect
;
import
com.fasterxml.jackson.annotation.PropertyAccessor
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.github.benmanes.caffeine.cache.CaffeineSpec
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.autoconfigure.cache.CacheProperties
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnExpression
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.cache.CacheManager
;
import
org.springframework.cache.annotation.EnableCaching
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.data.redis.cache.RedisCacheConfiguration
;
import
org.springframework.data.redis.cache.RedisCacheWriter
;
import
org.springframework.data.redis.connection.RedisConnectionFactory
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.data.redis.listener.RedisMessageListenerContainer
;
import
org.springframework.data.redis.listener.adapter.MessageListenerAdapter
;
import
org.springframework.data.redis.serializer.RedisSerializationContext
;
import
org.springframework.data.redis.serializer.StringRedisSerializer
;
import
org.springframework.util.StringUtils
;
import
java.time.Duration
;
import
cn.ibizlab.util.cache.cacheManager.LayeringCacheManager
;
import
cn.ibizlab.util.cache.listener.RedisMessageListener
;
import
cn.ibizlab.util.cache.redis.CustomJacksonSerializer
;
import
cn.ibizlab.util.enums.RedisChannelTopic
;
/**
* 缓存配置类
* 1级缓存为caffeine
* 2级缓存为redis
*/
@EnableCaching
@Configuration
@EnableConfigurationProperties
(
CacheProperties
.
class
)
@ConditionalOnExpression
(
"'${ibiz.cacheLevel:None}'.equals('L2')"
)
public
class
RedisCacheConfig
{
@Value
(
"${spring.cache.redis.time-to-live:3600}"
)
private
long
timeToLive
;
/**
* 分层缓存管理器
* @param redisConnectionFactory
* @param cacheProperties
* @return
*/
@Bean
@Primary
public
CacheManager
cacheManager
(
RedisConnectionFactory
redisConnectionFactory
,
CacheProperties
cacheProperties
){
LayeringCacheManager
layeringCacheManager
=
new
LayeringCacheManager
(
redisCacheWriter
(
redisConnectionFactory
),
redisCacheConfiguration
(),
redisTemplate
(
redisConnectionFactory
));
String
strCacheConfig
=
cacheProperties
.
getCaffeine
().
getSpec
();
if
(
StringUtils
.
hasText
(
strCacheConfig
))
{
layeringCacheManager
.
setCaffeineCacheConfig
(
CaffeineSpec
.
parse
(
strCacheConfig
));
}
return
layeringCacheManager
;
}
/**
* redis配置:设置过期时间及序列化方式
* @return
*/
@Bean
public
RedisCacheConfiguration
redisCacheConfiguration
(){
CustomJacksonSerializer
jackson2JsonRedisSerializer
=
new
CustomJacksonSerializer
(
Object
.
class
);
ObjectMapper
om
=
new
ObjectMapper
();
om
.
setVisibility
(
PropertyAccessor
.
ALL
,
JsonAutoDetect
.
Visibility
.
ANY
);
om
.
enableDefaultTyping
(
ObjectMapper
.
DefaultTyping
.
NON_FINAL
);
jackson2JsonRedisSerializer
.
setObjectMapper
(
om
);
RedisCacheConfiguration
configuration
=
RedisCacheConfiguration
.
defaultCacheConfig
()
.
entryTtl
(
Duration
.
ofSeconds
(
timeToLive
))
.
serializeKeysWith
(
RedisSerializationContext
.
SerializationPair
.
fromSerializer
(
new
StringRedisSerializer
()))
.
serializeValuesWith
(
RedisSerializationContext
.
SerializationPair
.
fromSerializer
(
jackson2JsonRedisSerializer
))
.
disableCachingNullValues
();
return
configuration
;
}
/**
* 创建redis缓存
* @param connectionFactory
* @return
*/
@Bean
public
RedisCacheWriter
redisCacheWriter
(
RedisConnectionFactory
connectionFactory
){
RedisCacheWriter
redisCacheWriter
=
RedisCacheWriter
.
nonLockingRedisCacheWriter
(
connectionFactory
);
return
redisCacheWriter
;
}
/**
* 发送redis广播
* @param factory
* @return
*/
@Bean
public
RedisTemplate
<
String
,
Object
>
redisTemplate
(
RedisConnectionFactory
factory
)
{
RedisTemplate
<
String
,
Object
>
template
=
new
RedisTemplate
<>();
template
.
setConnectionFactory
(
factory
);
CustomJacksonSerializer
jacksonSerial
=
new
CustomJacksonSerializer
(
Object
.
class
);
ObjectMapper
om
=
new
ObjectMapper
();
om
.
setVisibility
(
PropertyAccessor
.
ALL
,
JsonAutoDetect
.
Visibility
.
ANY
);
jacksonSerial
.
setObjectMapper
(
om
);
template
.
setValueSerializer
(
jacksonSerial
);
template
.
setKeySerializer
(
new
StringRedisSerializer
());
template
.
setHashKeySerializer
(
new
StringRedisSerializer
());
template
.
setHashValueSerializer
(
jacksonSerial
);
template
.
afterPropertiesSet
();
return
template
;
}
/**
* 监听redis指定频道
* @param redisConnectionFactory
* @param cacheManager
* @param redisTemplate
* @return
*/
@Bean
RedisMessageListenerContainer
redisContainer
(
RedisConnectionFactory
redisConnectionFactory
,
CacheManager
cacheManager
,
RedisTemplate
redisTemplate
)
{
RedisMessageListenerContainer
container
=
new
RedisMessageListenerContainer
();
MessageListenerAdapter
messageListener
=
new
RedisMessageListener
(
cacheManager
,
redisTemplate
);
container
.
setConnectionFactory
(
redisConnectionFactory
);
container
.
addMessageListener
(
messageListener
,
RedisChannelTopic
.
REDIS_CACHE_DELETE_TOPIC
.
getChannelTopic
());
container
.
addMessageListener
(
messageListener
,
RedisChannelTopic
.
REDIS_CACHE_CLEAR_TOPIC
.
getChannelTopic
());
container
.
addMessageListener
(
messageListener
,
RedisChannelTopic
.
REDIS_CACHE_DYNAMICMODEL_TOPIC
.
getChannelTopic
());
return
container
;
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/cache/cache/CusCaffeineCache.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
cache
.
cache
;
import
cn.ibizlab.util.helper.Globs
;
import
org.springframework.cache.caffeine.CaffeineCache
;
import
com.github.benmanes.caffeine.cache.Cache
;
import
javax.validation.constraints.NotNull
;
import
java.util.Set
;
import
java.util.stream.Collectors
;
/**
* 自定义的Caffeine缓存
*/
public
class
CusCaffeineCache
extends
CaffeineCache
{
public
CusCaffeineCache
(
String
name
,
Cache
<
Object
,
Object
>
cache
)
{
super
(
name
,
cache
);
}
public
CusCaffeineCache
(
String
name
,
Cache
<
Object
,
Object
>
cache
,
boolean
allowNullValues
)
{
super
(
name
,
cache
,
allowNullValues
);
}
@Override
public
void
evict
(
@NotNull
Object
key
)
{
if
(
key
instanceof
String
&&
((
String
)
key
).
startsWith
(
"glob:"
))
{
String
globPattern
=
((
String
)
key
).
split
(
"glob:"
)[
1
];
// 将Glob匹配转换成正则匹配
String
regexPattern
=
Globs
.
toUnixRegexPattern
(
globPattern
);
// String regexPattern = Globs.toWindowsRegexPattern(globPattern);
Cache
<
Object
,
Object
>
cache
=
super
.
getNativeCache
();
Set
<
Object
>
keySet
=
cache
.
asMap
().
keySet
();
keySet
=
keySet
.
stream
().
filter
(
o
->
o
.
toString
().
matches
(
regexPattern
)).
collect
(
Collectors
.
toSet
());
cache
.
invalidateAll
(
keySet
);
}
else
{
super
.
evict
(
key
);
}
}
}
src/main/java/cn/ibizlab/util/cache/cache/CusRedisCache.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
cache
.
cache
;
import
org.springframework.data.redis.cache.RedisCache
;
import
org.springframework.data.redis.cache.RedisCacheConfiguration
;
import
org.springframework.data.redis.cache.RedisCacheWriter
;
import
javax.validation.constraints.NotNull
;
/**
* 自定义的redis缓存
*/
public
class
CusRedisCache
extends
RedisCache
{
public
CusRedisCache
(
String
name
,
RedisCacheWriter
redisCacheWriter
,
RedisCacheConfiguration
configuration
)
{
super
(
name
,
redisCacheWriter
,
configuration
);
}
@Override
public
void
evict
(
@NotNull
Object
key
)
{
if
(
key
instanceof
String
&&
((
String
)
key
).
startsWith
(
"glob:"
))
{
String
globPattern
=
((
String
)
key
).
split
(
"glob:"
)[
1
];
byte
[]
globPatternBytes
=
super
.
getCacheConfiguration
().
getConversionService
().
convert
(
globPattern
,
byte
[].
class
);
if
(
globPatternBytes
!=
null
){
super
.
getNativeCache
().
clean
(
super
.
getName
(),
globPatternBytes
);
}
}
else
{
super
.
evict
(
key
);
}
}
}
src/main/java/cn/ibizlab/util/cache/cache/LayeringCache.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
cache
.
cache
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.cache.caffeine.CaffeineCache
;
import
org.springframework.cache.support.AbstractValueAdaptingCache
;
import
org.springframework.cache.support.NullValue
;
import
org.springframework.data.redis.cache.RedisCache
;
import
org.springframework.data.redis.core.RedisOperations
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.concurrent.Callable
;
import
cn.ibizlab.util.cache.listener.RedisPublisher
;
import
cn.ibizlab.util.enums.RedisChannelTopic
;
import
org.springframework.util.ObjectUtils
;
/**
* 缓存分层类
* 1级缓存为caffeine
* 2级缓存为redis
*/
@Slf4j
public
class
LayeringCache
extends
AbstractValueAdaptingCache
{
/**
* 缓存的名称
*/
private
String
cacheName
;
/**
* Caffeine缓存
*/
private
CaffeineCache
caffeineCache
;
/**
* redis缓存
*/
private
RedisCache
redisCache
;
/**
* redis消息发布
*/
RedisOperations
<?
extends
Object
,
?
extends
Object
>
redisOperations
;
public
LayeringCache
(
String
cacheName
,
CaffeineCache
caffeineCache
,
RedisCache
redisCache
,
RedisOperations
redisOperations
)
{
super
(
true
);
this
.
cacheName
=
cacheName
;
this
.
caffeineCache
=
caffeineCache
;
this
.
redisCache
=
redisCache
;
this
.
redisOperations
=
redisOperations
;
}
@Override
public
String
getName
()
{
return
this
.
cacheName
;
}
@Override
public
Object
getNativeCache
()
{
return
this
;
}
@Override
public
ValueWrapper
get
(
Object
key
)
{
ValueWrapper
wrapper
=
caffeineCache
.
get
(
key
);
Object
value
=
ObjectUtils
.
isEmpty
(
wrapper
)
?
null
:
wrapper
.
get
();
log
.
debug
(
"查询一级缓存 key:{} "
,
key
,
value
);
if
(
ObjectUtils
.
isEmpty
(
value
))
{
wrapper
=
redisCache
.
get
(
key
);
value
=
ObjectUtils
.
isEmpty
(
wrapper
)
?
null
:
wrapper
.
get
();
log
.
debug
(
"查询二级缓存 key:{} "
,
key
);
if
(!
ObjectUtils
.
isEmpty
(
value
))
{
caffeineCache
.
put
(
key
,
value
);
log
.
debug
(
"查询二级缓存,并将数据放到一级缓存。 key:{} "
,
key
);
}
}
return
wrapper
;
}
@Override
public
<
T
>
T
get
(
Object
key
,
Class
<
T
>
type
)
{
T
value
=
caffeineCache
.
get
(
key
,
type
);
log
.
debug
(
"查询一级缓存 key:{}"
,
key
);
if
(
value
==
null
)
{
value
=
redisCache
.
get
(
key
,
type
);
caffeineCache
.
put
(
key
,
value
);
log
.
debug
(
"查询二级缓存,并将数据放到一级缓存。 key:{}"
,
key
);
}
return
value
;
}
@SuppressWarnings
(
"unchecked"
)
@Override
public
<
T
>
T
get
(
Object
key
,
Callable
<
T
>
valueLoader
)
{
T
value
=
(
T
)
caffeineCache
.
getNativeCache
().
get
(
key
,
k
->
getSecondCacheValue
(
k
,
valueLoader
));
if
(
value
==
null
)
{
value
=
(
T
)
getSecondCacheValue
(
key
,
valueLoader
);
}
if
(
value
instanceof
NullValue
)
{
return
null
;
}
return
value
;
}
@Override
public
void
put
(
Object
key
,
Object
value
)
{
if
(
value
!=
null
)
{
caffeineCache
.
put
(
key
,
value
);
redisCache
.
put
(
key
,
value
);
}
}
@Override
public
ValueWrapper
putIfAbsent
(
Object
key
,
Object
value
)
{
caffeineCache
.
putIfAbsent
(
key
,
value
);
return
redisCache
.
putIfAbsent
(
key
,
value
);
}
@Override
public
void
evict
(
Object
key
)
{
redisCache
.
evict
(
key
);
//清除redis中的二级缓存
caffeineCache
.
evict
(
key
);
//清除本机一级缓存
Map
<
String
,
Object
>
message
=
new
HashMap
<>();
message
.
put
(
"cacheName"
,
cacheName
);
message
.
put
(
"key"
,
key
);
RedisPublisher
redisPublisher
=
new
RedisPublisher
(
redisOperations
,
RedisChannelTopic
.
REDIS_CACHE_DELETE_TOPIC
.
getChannelTopic
());
// 创建redis发布者
redisPublisher
.
publisher
(
message
);
//发布消息,清除其它集群机器中的一级缓存
log
.
debug
(
String
.
format
(
"清除二级缓存数据[%s]"
,
key
));
}
@Override
public
void
clear
()
{
redisCache
.
clear
();
//清除redis中的二级缓存
caffeineCache
.
clear
();
//清除本机一级缓存
Map
<
String
,
Object
>
message
=
new
HashMap
<>();
message
.
put
(
"cacheName"
,
cacheName
);
RedisPublisher
redisPublisher
=
new
RedisPublisher
(
redisOperations
,
RedisChannelTopic
.
REDIS_CACHE_CLEAR_TOPIC
.
getChannelTopic
());
// 创建redis发布者
redisPublisher
.
publisher
(
message
);
//发布消息,清除其它集群机器中的一级缓存
}
@Override
protected
Object
lookup
(
Object
key
)
{
Object
value
=
caffeineCache
.
get
(
key
);
log
.
debug
(
"查询一级缓存 key:{}"
,
key
);
if
(
value
==
null
)
{
value
=
redisCache
.
get
(
key
);
log
.
debug
(
"查询二级缓存 key:{}"
,
key
);
}
return
value
;
}
/**
* 获取caffeine缓存
* @return
*/
public
CaffeineCache
getFirstCache
()
{
return
this
.
caffeineCache
;
}
/**
* 获取redis缓存
* @return
*/
public
RedisCache
getSecondCache
()
{
return
this
.
redisCache
;
}
/**
* 查询二级缓存
* @param key
* @param valueLoader
* @return
*/
private
<
T
>
Object
getSecondCacheValue
(
Object
key
,
Callable
<
T
>
valueLoader
)
{
T
value
=
redisCache
.
get
(
key
,
valueLoader
);
log
.
debug
(
"查询二级缓存 key:{}"
,
key
);
return
toStoreValue
(
value
);
}
}
src/main/java/cn/ibizlab/util/cache/cacheManager/CaffeineCacheManager.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
cache
.
cacheManager
;
import
lombok.Data
;
import
com.github.benmanes.caffeine.cache.Caffeine
;
import
com.github.benmanes.caffeine.cache.CaffeineSpec
;
import
org.springframework.cache.Cache
;
import
org.springframework.cache.CacheManager
;
import
org.springframework.cache.caffeine.CaffeineCache
;
import
org.springframework.util.ObjectUtils
;
import
java.util.Collection
;
import
java.util.Collections
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.ConcurrentMap
;
import
java.util.concurrent.TimeUnit
;
/**
* Caffeine本地缓存
*/
@Data
public
class
CaffeineCacheManager
implements
CacheManager
{
private
final
ConcurrentMap
<
String
,
Cache
>
cacheMap
=
new
ConcurrentHashMap
<
String
,
Cache
>(
16
);
private
static
final
int
default_expire_after_write
=
1
;
private
static
final
int
default_initial_capacity
=
5
;
private
static
final
int
default_maximum_size
=
1_000
;
private
Caffeine
<
Object
,
Object
>
cacheBuilder
=
Caffeine
.
newBuilder
()
.
expireAfterAccess
(
default_expire_after_write
,
TimeUnit
.
HOURS
)
.
initialCapacity
(
default_initial_capacity
)
.
maximumSize
(
default_maximum_size
);
/**
* 获取缓存对象
* @param cacheName
* @return
*/
@Override
public
Cache
getCache
(
String
cacheName
)
{
Cache
cache
=
this
.
cacheMap
.
get
(
cacheName
);
if
(
cache
==
null
)
{
synchronized
(
this
.
cacheMap
)
{
cache
=
this
.
cacheMap
.
get
(
cacheName
);
if
(
cache
==
null
)
{
cache
=
createCache
(
cacheName
);
this
.
cacheMap
.
put
(
cacheName
,
cache
);
}
}
}
return
cache
;
}
/**
* 创建缓存
* @param cacheName
* @return
*/
protected
Cache
createCache
(
String
cacheName
)
{
return
new
CaffeineCache
(
cacheName
,
this
.
cacheBuilder
.
build
(),
true
);
}
/**
* 获取缓存名
* @return
*/
@Override
public
Collection
<
String
>
getCacheNames
()
{
return
Collections
.
unmodifiableSet
(
this
.
cacheMap
.
keySet
());
}
/**
* 缓存配置[缓存容量大小、时长等]
* @param caffeineCacheConfig
*/
public
void
setCaffeineCacheConfig
(
CaffeineSpec
caffeineCacheConfig
)
{
Caffeine
<
Object
,
Object
>
cacheBuilder
=
Caffeine
.
from
(
caffeineCacheConfig
);
if
(!
ObjectUtils
.
nullSafeEquals
(
this
.
cacheBuilder
,
cacheBuilder
))
{
this
.
cacheBuilder
=
cacheBuilder
;
}
}
}
src/main/java/cn/ibizlab/util/cache/cacheManager/LayeringCacheManager.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
cache
.
cacheManager
;
import
lombok.Data
;
import
com.github.benmanes.caffeine.cache.Caffeine
;
import
com.github.benmanes.caffeine.cache.CaffeineSpec
;
import
org.springframework.cache.Cache
;
import
org.springframework.cache.CacheManager
;
import
org.springframework.cache.caffeine.CaffeineCache
;
import
org.springframework.data.redis.cache.RedisCacheConfiguration
;
import
org.springframework.data.redis.cache.RedisCacheWriter
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.util.ObjectUtils
;
import
java.util.Collection
;
import
java.util.Collections
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.ConcurrentMap
;
import
java.util.concurrent.TimeUnit
;
import
cn.ibizlab.util.cache.cache.CusCaffeineCache
;
import
cn.ibizlab.util.cache.cache.CusRedisCache
;
import
cn.ibizlab.util.cache.cache.LayeringCache
;
/**
* 缓存分层
* 1级缓存为caffeine
* 2级缓存为redis
*/
@Data
public
class
LayeringCacheManager
implements
CacheManager
{
private
final
ConcurrentMap
<
String
,
Cache
>
cacheMap
=
new
ConcurrentHashMap
<
String
,
Cache
>(
16
);
private
static
final
int
default_expire_after_write
=
1
;
private
static
final
int
default_initial_capacity
=
5
;
private
static
final
int
default_maximum_size
=
1_000
;
private
Caffeine
<
Object
,
Object
>
cacheBuilder
=
Caffeine
.
newBuilder
()
.
expireAfterAccess
(
default_expire_after_write
,
TimeUnit
.
HOURS
)
.
initialCapacity
(
default_initial_capacity
)
.
maximumSize
(
default_maximum_size
);
private
RedisCacheWriter
redisCacheWriter
;
private
RedisCacheConfiguration
redisConfiguration
;
private
RedisTemplate
<
String
,
Object
>
redisTemplate
;
public
LayeringCacheManager
(
RedisCacheWriter
redisCacheWriter
,
RedisCacheConfiguration
redisConfiguration
,
RedisTemplate
<
String
,
Object
>
redisTemplate
){
this
.
redisCacheWriter
=
redisCacheWriter
;
this
.
redisConfiguration
=
redisConfiguration
;
this
.
redisTemplate
=
redisTemplate
;
}
/**
* 获取缓存对象
* @param cacheName
* @return
*/
@Override
public
Cache
getCache
(
String
cacheName
)
{
Cache
cache
=
this
.
cacheMap
.
get
(
cacheName
);
if
(
cache
==
null
)
{
synchronized
(
this
.
cacheMap
)
{
cache
=
this
.
cacheMap
.
get
(
cacheName
);
if
(
cache
==
null
)
{
cache
=
createCache
(
cacheName
);
this
.
cacheMap
.
put
(
cacheName
,
cache
);
}
}
}
return
cache
;
}
/**
* 获取集合中的缓存
* @return
*/
@Override
public
Collection
<
String
>
getCacheNames
()
{
return
Collections
.
unmodifiableSet
(
this
.
cacheMap
.
keySet
());
}
/**
* 创建缓存
* @param cacheName
* @return
*/
protected
Cache
createCache
(
String
cacheName
)
{
return
new
LayeringCache
(
cacheName
,
new
CusCaffeineCache
(
cacheName
,
this
.
cacheBuilder
.
build
(),
true
),
new
CusRedisCache
(
cacheName
,
redisCacheWriter
,
redisConfiguration
),
redisTemplate
);
}
/**
* 缓存配置[缓存容量大小、时长等]
* @param caffeineCacheConfig
*/
public
void
setCaffeineCacheConfig
(
CaffeineSpec
caffeineCacheConfig
)
{
Caffeine
<
Object
,
Object
>
cacheBuilder
=
Caffeine
.
from
(
caffeineCacheConfig
);
if
(!
ObjectUtils
.
nullSafeEquals
(
this
.
cacheBuilder
,
cacheBuilder
))
{
this
.
cacheBuilder
=
cacheBuilder
;
}
}
}
src/main/java/cn/ibizlab/util/cache/listener/RedisMessageListener.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
cache
.
listener
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.cache.Cache
;
import
org.springframework.cache.CacheManager
;
import
org.springframework.data.redis.connection.Message
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.data.redis.listener.adapter.MessageListenerAdapter
;
import
org.springframework.data.redis.serializer.RedisSerializer
;
import
org.springframework.util.StringUtils
;
import
org.springframework.util.ObjectUtils
;
import
java.util.Map
;
import
cn.ibizlab.util.cache.cache.LayeringCache
;
import
cn.ibizlab.util.enums.RedisChannelTopic
;
/**
* redis消息的订阅者
*/
@Slf4j
public
class
RedisMessageListener
extends
MessageListenerAdapter
{
private
CacheManager
cacheManager
;
private
RedisTemplate
redisTemplate
;
public
RedisMessageListener
(
CacheManager
cacheManager
,
RedisTemplate
redisTemplate
){
this
.
cacheManager
=
cacheManager
;
this
.
redisTemplate
=
redisTemplate
;
}
@Override
public
void
onMessage
(
Message
message
,
byte
[]
pattern
)
{
RedisChannelTopic
channelTopic
=
RedisChannelTopic
.
getChannelTopicEnum
(
new
String
(
message
.
getChannel
()));
Map
<
String
,
Object
>
map
=
null
;
RedisSerializer
serializer
=
redisTemplate
.
getValueSerializer
();
Object
result
=
serializer
.
deserialize
(
message
.
getBody
());
if
(
result
instanceof
Map
){
map
=
(
Map
<
String
,
Object
>)
result
;
}
if
(
StringUtils
.
isEmpty
(
map
)||
(!
map
.
containsKey
(
"cacheName"
))){
log
.
debug
(
"解析缓存数据失败,无法获取指定值!"
);
return
;
}
log
.
debug
(
"redis消息订阅者接收到频道【{}】发布的消息。消息内容:{}"
,
channelTopic
.
getChannelTopicStr
(),
result
.
toString
());
String
cacheName
=
(
String
)
map
.
get
(
"cacheName"
);
Cache
cache
=
cacheManager
.
getCache
(
cacheName
);
// 根据缓存名称获取多级缓存
if
(
cache
!=
null
&&
cache
instanceof
LayeringCache
)
{
// 判断缓存是否是多级缓存
switch
(
channelTopic
)
{
case
REDIS_CACHE_DELETE_TOPIC:
// 获取一级缓存,并删除一级缓存数据
Object
cacheKey
=
map
.
get
(
"key"
);
if
(!
ObjectUtils
.
isEmpty
(
cacheKey
)){
((
LayeringCache
)
cache
).
getFirstCache
().
evict
(
cacheKey
);
((
LayeringCache
)
cache
).
getSecondCache
().
evict
(
cacheKey
);
log
.
debug
(
"同步删除缓存{}数据,key:{},"
,
cacheName
,
cacheKey
.
toString
());
}
else
{
log
.
debug
(
"同步删除缓存失败,{}缓存键值为空!"
,
cacheName
);
}
break
;
case
REDIS_CACHE_CLEAR_TOPIC:
// 获取一级缓存,并删除一级缓存数据
((
LayeringCache
)
cache
).
getFirstCache
().
clear
();
((
LayeringCache
)
cache
).
getSecondCache
().
clear
();
log
.
debug
(
"同步清除缓存{}数据"
,
cacheName
);
break
;
default
:
log
.
debug
(
"接收到没有定义的订阅消息频道数据"
);
break
;
}
}
}
}
src/main/java/cn/ibizlab/util/cache/listener/RedisPublisher.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
cache
.
listener
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.data.redis.core.RedisOperations
;
import
org.springframework.data.redis.listener.ChannelTopic
;
/**
* redis消息的发布者
*/
public
class
RedisPublisher
{
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
RedisPublisher
.
class
);
RedisOperations
<?
extends
Object
,
?
extends
Object
>
redisOperations
;
/**
* 频道名称
*/
ChannelTopic
channelTopic
;
/**
* @param redisOperations Redis客户端
* @param channelTopic 频道名称
*/
public
RedisPublisher
(
RedisOperations
<?
extends
Object
,
?
extends
Object
>
redisOperations
,
ChannelTopic
channelTopic
)
{
this
.
channelTopic
=
channelTopic
;
this
.
redisOperations
=
redisOperations
;
}
/**
* 发布消息到频道(Channel)
*
* @param message 消息内容
*/
public
void
publisher
(
Object
message
)
{
redisOperations
.
convertAndSend
(
channelTopic
.
toString
(),
message
);
logger
.
debug
(
"redis消息发布者向频道【{}】发布了【{}】消息"
,
channelTopic
.
toString
(),
message
.
toString
());
}
}
src/main/java/cn/ibizlab/util/cache/redis/CustomJacksonSerializer.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
cache
.
redis
;
import
cn.ibizlab.util.security.AuthenticationUser
;
import
org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer
;
import
org.springframework.data.redis.serializer.SerializationException
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
public
class
CustomJacksonSerializer
<
T
>
extends
Jackson2JsonRedisSerializer
<
T
>
{
public
static
final
String
DEFAULT_PACKAGE
=
"[\\w+\\.]+\\.AuthenticationUser"
;
public
static
final
String
CLASSNAME_EX
=
"_$$_"
;
public
static
final
String
CLASSNAME_EX_PATTEN
=
"(_\\$\\$_)(\\w+)"
;
public
static
final
String
USER_PACKAGE
=
AuthenticationUser
.
class
.
getName
();
public
CustomJacksonSerializer
(
Class
type
)
{
super
(
type
);
}
@Override
public
T
deserialize
(
byte
[]
bytes
)
throws
SerializationException
{
String
serializerContent
=
new
String
(
bytes
,
DEFAULT_CHARSET
);
Matcher
matcher
=
Pattern
.
compile
(
DEFAULT_PACKAGE
).
matcher
(
serializerContent
);
if
(
matcher
.
find
()){
serializerContent
=
serializerContent
.
replaceAll
(
DEFAULT_PACKAGE
,
USER_PACKAGE
);
}
if
(
serializerContent
.
contains
(
CLASSNAME_EX
)){
serializerContent
=
serializerContent
.
replaceAll
(
CLASSNAME_EX_PATTEN
,
""
);
}
return
super
.
deserialize
(
serializerContent
.
getBytes
());
}
}
src/main/java/cn/ibizlab/util/client/IBZLiteFallback.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
client
;
import
com.alibaba.fastjson.JSONObject
;
import
org.springframework.stereotype.Component
;
import
java.util.List
;
import
java.util.Map
;
@Component
public
class
IBZLiteFallback
implements
IBZLiteFeignClient
{
@Override
public
Boolean
syncSysModel
(
JSONObject
system
)
{
return
null
;
}
}
src/main/java/cn/ibizlab/util/client/IBZLiteFeignClient.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
client
;
import
com.alibaba.fastjson.JSONObject
;
import
org.springframework.cloud.openfeign.FeignClient
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.List
;
import
java.util.Map
;
@FeignClient
(
value
=
"${ibiz.ref.service.lite:ibzlite-api}"
,
contextId
=
"lite"
,
fallback
=
IBZLiteFallback
.
class
)
public
interface
IBZLiteFeignClient
{
/**
* 同步系统资模型到lite
* @param system 系统模型信息
* @return
*/
@PostMapping
(
"/lite/syncsysmodel"
)
Boolean
syncSysModel
(
@RequestBody
JSONObject
system
);
}
src/main/java/cn/ibizlab/util/client/IBZNotifyFallback.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
client
;
import
cn.ibizlab.util.domain.MsgBody
;
import
com.alibaba.fastjson.JSONObject
;
import
org.springframework.stereotype.Component
;
@Component
public
class
IBZNotifyFallback
implements
IBZNotifyFeignClient
{
@Override
public
Boolean
sendMsg
(
MsgBody
msg
)
{
return
null
;
}
@Override
public
Boolean
createMsgTemplate
(
JSONObject
template
)
{
return
null
;
}
@Override
public
Boolean
sendDingTalkLinkMsg
(
MsgBody
msg
)
{
return
null
;
}
@Override
public
String
createDingTalkWorkRecord
(
MsgBody
msg
)
{
return
null
;
}
@Override
public
Boolean
finishDingTalkWorkRecord
(
String
msgId
)
{
return
null
;
}
}
src/main/java/cn/ibizlab/util/client/IBZNotifyFeignClient.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
client
;
import
cn.ibizlab.util.domain.MsgBody
;
import
com.alibaba.fastjson.JSONObject
;
import
org.springframework.cloud.openfeign.FeignClient
;
import
org.springframework.web.bind.annotation.*
;
@FeignClient
(
value
=
"${ibiz.ref.service.notify:ibznotify-api}"
,
contextId
=
"notify"
,
fallback
=
IBZNotifyFallback
.
class
)
public
interface
IBZNotifyFeignClient
{
@RequestMapping
(
method
=
RequestMethod
.
POST
,
value
=
"/notify/sendmsg"
)
Boolean
sendMsg
(
@RequestBody
MsgBody
msg
);
@RequestMapping
(
method
=
RequestMethod
.
POST
,
value
=
"/notify/createmsgtempl"
)
Boolean
createMsgTemplate
(
@RequestBody
JSONObject
template
);
@RequestMapping
(
method
=
RequestMethod
.
POST
,
value
=
"/notify/dingtalk/sendlinkmsg"
)
Boolean
sendDingTalkLinkMsg
(
@RequestBody
MsgBody
msg
);
@RequestMapping
(
method
=
RequestMethod
.
POST
,
value
=
"/notify/dingtalk/createworkrecord"
)
String
createDingTalkWorkRecord
(
@RequestBody
MsgBody
msg
);
@RequestMapping
(
method
=
RequestMethod
.
POST
,
value
=
"/notify/dingtalk/finishworkrecord/{msgid}"
)
Boolean
finishDingTalkWorkRecord
(
@PathVariable
(
"msgid"
)
String
msgId
);
}
src/main/java/cn/ibizlab/util/client/IBZOUFallback.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
client
;
import
org.springframework.stereotype.Component
;
import
java.util.Map
;
import
java.util.Set
;
@Component
public
class
IBZOUFallback
implements
IBZOUFeignClient
{
@Override
public
Map
<
String
,
Set
<
String
>>
getOUMapsByUserId
(
String
userId
)
{
return
null
;
}
}
src/main/java/cn/ibizlab/util/client/IBZOUFeignClient.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
client
;
import
org.springframework.cloud.openfeign.FeignClient
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
java.util.Map
;
import
java.util.Set
;
@FeignClient
(
value
=
"${ibiz.ref.service.ou:ibzou-api}"
,
contextId
=
"ou"
,
fallback
=
IBZOUFallback
.
class
)
public
interface
IBZOUFeignClient
{
/**
* 从ou中获取当前上下级组织、部门信息
* @param userId
* @return
*/
@GetMapping
(
"/sysemployees/{userId}/oumaps"
)
Map
<
String
,
Set
<
String
>>
getOUMapsByUserId
(
@PathVariable
(
"userId"
)
String
userId
);
}
src/main/java/cn/ibizlab/util/client/IBZPayFallback.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
client
;
import
cn.ibizlab.util.domain.PayTrade
;
import
com.alibaba.fastjson.JSONObject
;
import
org.springframework.stereotype.Component
;
@Component
public
class
IBZPayFallback
implements
IBZPayFeignClient
{
@Override
public
JSONObject
preCreate
(
PayTrade
trade
)
{
return
null
;
}
@Override
public
JSONObject
query
(
PayTrade
trade
)
{
return
null
;
}
@Override
public
JSONObject
cancel
(
PayTrade
trade
)
{
return
null
;
}
@Override
public
String
pagePay
(
PayTrade
trade
)
{
return
null
;
}
}
src/main/java/cn/ibizlab/util/client/IBZPayFeignClient.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
client
;
import
cn.ibizlab.util.domain.PayTrade
;
import
com.alibaba.fastjson.JSONObject
;
import
org.springframework.cloud.openfeign.FeignClient
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMethod
;
@FeignClient
(
value
=
"${ibiz.ref.service.pay:ibzpay-api}"
,
contextId
=
"pay"
,
fallback
=
IBZPayFallback
.
class
)
public
interface
IBZPayFeignClient
{
@RequestMapping
(
method
=
RequestMethod
.
POST
,
value
=
"/pay/trade/precreate"
)
JSONObject
preCreate
(
@RequestBody
PayTrade
trade
);
@RequestMapping
(
method
=
RequestMethod
.
POST
,
value
=
"/pay/trade/query"
)
JSONObject
query
(
@RequestBody
PayTrade
trade
);
@RequestMapping
(
method
=
RequestMethod
.
POST
,
value
=
"/pay/trade/cancel"
)
JSONObject
cancel
(
@RequestBody
PayTrade
trade
);
@RequestMapping
(
method
=
RequestMethod
.
POST
,
value
=
"/pay/trade/pagepay"
)
String
pagePay
(
@RequestBody
PayTrade
trade
);
}
src/main/java/cn/ibizlab/util/client/IBZUAAFallback.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
client
;
import
cn.ibizlab.util.security.AuthenticationUser
;
import
cn.ibizlab.util.security.AuthorizationLogin
;
import
org.springframework.util.MultiValueMap
;
import
org.springframework.stereotype.Component
;
import
com.alibaba.fastjson.JSONObject
;
@Component
public
class
IBZUAAFallback
implements
IBZUAAFeignClient
{
@Override
public
Boolean
syncSysAuthority
(
JSONObject
system
)
{
return
null
;
}
@Override
public
AuthenticationUser
login
(
AuthorizationLogin
authorizationLogin
)
{
return
null
;
}
@Override
public
AuthenticationUser
loginByUsername
(
String
username
)
{
return
null
;
}
@Override
public
String
getPublicKey
()
{
return
null
;
}
}
src/main/java/cn/ibizlab/util/client/IBZUAAFeignClient.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
client
;
import
cn.ibizlab.util.security.AuthenticationUser
;
import
cn.ibizlab.util.security.AuthorizationLogin
;
import
org.springframework.cache.annotation.Cacheable
;
import
org.springframework.cloud.openfeign.FeignClient
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.util.MultiValueMap
;
import
com.alibaba.fastjson.JSONObject
;
@FeignClient
(
value
=
"${ibiz.ref.service.uaa:ibzuaa-api}"
,
contextId
=
"uaa"
,
fallback
=
IBZUAAFallback
.
class
)
public
interface
IBZUAAFeignClient
{
/**
* 同步系统资源到uaa
* @param system 系统资源信息
* @return
*/
@PostMapping
(
"/syspssystems/save"
)
Boolean
syncSysAuthority
(
@RequestBody
JSONObject
system
);
/**
* 用户登录
* @param authorizationLogin 登录信息
* @return
*/
@PostMapping
(
value
=
"/uaa/login"
)
AuthenticationUser
login
(
@RequestBody
AuthorizationLogin
authorizationLogin
);
@PostMapping
(
value
=
"/uaa/loginbyusername"
)
AuthenticationUser
loginByUsername
(
@RequestBody
String
username
);
@Cacheable
(
value
=
"ibzuaa_publickey"
)
@GetMapping
(
value
=
"/uaa/publickey"
)
String
getPublicKey
();
}
src/main/java/cn/ibizlab/util/client/IBZWFFallback.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
client
;
import
org.springframework.stereotype.Component
;
import
com.alibaba.fastjson.JSONObject
;
import
java.util.*
;
import
java.io.Serializable
;
@Component
public
class
IBZWFFallback
implements
IBZWFFeignClient
{
@Override
public
List
<
String
>
getbusinesskeys
(
String
system
,
String
appname
,
String
entity
,
String
processDefinitionKey
,
String
taskDefinitionKey
)
{
return
null
;
}
@Override
public
List
<
String
>
getbusinesskeysByUserId
(
String
system
,
String
userId
,
String
entity
,
String
processDefinitionKey
,
String
taskDefinitionKey
)
{
return
null
;
}
@Override
public
Boolean
deployBpmnFile
(
List
<
Map
<
String
,
Object
>>
bpmnfiles
)
{
return
null
;
}
@Override
public
JSONObject
wfstart
(
String
system
,
String
appname
,
String
entity
,
String
businessKey
,
JSONObject
instance
)
{
return
null
;
}
@Override
public
Map
<
String
,
Map
<
String
,
Object
>>
getTask
(
String
system
,
String
userId
,
String
entity
,
String
instTag
,
String
instTag2
,
String
taskType
)
{
return
null
;
}
@Override
public
Map
<
String
,
Map
<
String
,
Object
>>
getTaskByStep
(
String
system
,
String
userId
,
String
entity
,
String
instTag
,
String
instTag2
,
String
taskType
,
String
srfwfstep
)
{
return
null
;
}
@Override
public
Integer
getDataAccessMode
(
String
system
,
String
entity
,
Serializable
businessKey
)
{
return
null
;
}
@Override
public
Map
<
String
,
Map
<
String
,
Object
>>
getMyTask
(
String
system
,
String
appName
,
String
entity
)
{
return
null
;
}
}
src/main/java/cn/ibizlab/util/client/IBZWFFeignClient.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
client
;
import
org.springframework.cloud.openfeign.FeignClient
;
import
org.springframework.web.bind.annotation.*
;
import
com.alibaba.fastjson.JSONObject
;
import
java.util.*
;
import
java.io.Serializable
;
@FeignClient
(
value
=
"${ibiz.ref.service.wf:ibzwf-api}"
,
contextId
=
"wf"
,
fallback
=
IBZWFFallback
.
class
)
public
interface
IBZWFFeignClient
{
@RequestMapping
(
method
=
RequestMethod
.
GET
,
value
=
"/{system}-app-{appname}/{entity}/process-definitions/{processDefinitionKey}/usertasks/{taskDefinitionKey}/tasks"
)
List
<
String
>
getbusinesskeys
(
@PathVariable
(
"system"
)
String
system
,
@PathVariable
(
"appname"
)
String
appname
,
@PathVariable
(
"entity"
)
String
entity
,
@PathVariable
(
"processDefinitionKey"
)
String
processDefinitionKey
,
@PathVariable
(
"taskDefinitionKey"
)
String
taskDefinitionKey
);
@RequestMapping
(
method
=
RequestMethod
.
POST
,
value
=
"/{system}-user-{userId}/{entity}/process-definitions/{processDefinitionKey}/usertasks/{taskDefinitionKey}/tasks"
)
List
<
String
>
getbusinesskeysByUserId
(
@PathVariable
(
"system"
)
String
system
,
@PathVariable
(
"userId"
)
String
userId
,
@PathVariable
(
"entity"
)
String
entity
,
@PathVariable
(
"processDefinitionKey"
)
String
processDefinitionKey
,
@PathVariable
(
"taskDefinitionKey"
)
String
taskDefinitionKey
);
@RequestMapping
(
method
=
RequestMethod
.
POST
,
value
=
"/deploybpmn"
)
Boolean
deployBpmnFile
(
@RequestBody
List
<
Map
<
String
,
Object
>>
bpmnfiles
);
@RequestMapping
(
method
=
RequestMethod
.
POST
,
value
=
"/{system}-app-{appname}/{entity}/{businessKey}/process-instances"
)
JSONObject
wfstart
(
@PathVariable
(
"system"
)
String
system
,
@PathVariable
(
"appname"
)
String
appname
,
@PathVariable
(
"entity"
)
String
entity
,
@PathVariable
(
"businessKey"
)
String
businessKey
,
@RequestBody
JSONObject
instance
);
@RequestMapping
(
method
=
RequestMethod
.
POST
,
value
=
"/{system}-user-{userId}/{insttag}/{insttag2}/{entity}/tasks"
)
Map
<
String
,
Map
<
String
,
Object
>>
getTask
(
@PathVariable
(
"system"
)
String
system
,
@PathVariable
(
"userId"
)
String
userId
,
@PathVariable
(
"entity"
)
String
entity
,
@PathVariable
(
"insttag"
)
String
instTag
,
@PathVariable
(
"insttag2"
)
String
instTag2
,
@RequestParam
(
"srfwf"
)
String
taskType
);
@RequestMapping
(
method
=
RequestMethod
.
POST
,
value
=
"/{system}-user-{userId}/{insttag}/{insttag2}/{entity}/tasks"
)
Map
<
String
,
Map
<
String
,
Object
>>
getTaskByStep
(
@PathVariable
(
"system"
)
String
system
,
@PathVariable
(
"userId"
)
String
userId
,
@PathVariable
(
"entity"
)
String
entity
,
@PathVariable
(
"insttag"
)
String
instTag
,
@PathVariable
(
"insttag2"
)
String
instTag2
,
@RequestParam
(
"srfwf"
)
String
taskType
,
@RequestParam
(
"n_taskdefinitionkey_eq"
)
String
srfwfstep
);
@RequestMapping
(
method
=
RequestMethod
.
GET
,
value
=
"/{system}/{entity}/{businessKey}/dataaccessmode"
)
Integer
getDataAccessMode
(
@PathVariable
(
"system"
)
String
system
,
@PathVariable
(
"entity"
)
String
entity
,
@PathVariable
(
"businessKey"
)
Serializable
businessKey
);
@RequestMapping
(
method
=
RequestMethod
.
GET
,
value
=
"/{system}-app-{appname}/{entity}/mytasks"
)
Map
<
String
,
Map
<
String
,
Object
>>
getMyTask
(
@PathVariable
(
"system"
)
String
system
,
@PathVariable
(
"appname"
)
String
appName
,
@PathVariable
(
"entity"
)
String
entity
);
}
src/main/java/cn/ibizlab/util/dict/StaticDict.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
dict
;
import
lombok.Getter
;
public
class
StaticDict
{
/**
* 代码表[扩展表格单元格垂直对齐方式]
*/
@Getter
public
enum
CodeList75
{
TOP
(
"TOP"
,
"上对齐"
),
MIDDLE
(
"MIDDLE"
,
"居中对齐"
),
BOTTOM
(
"BOTTOM"
,
"下对齐"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList75
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[数据库触发器目标]
*/
@Getter
public
enum
CodeList68
{
TABLE
(
"TABLE"
,
"主表"
),
VIEW
(
"VIEW"
,
"视图"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList68
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[审计行为]
*/
@Getter
public
enum
CodeList27
{
CREATE
(
"CREATE"
,
"建立"
),
UPDATE
(
"UPDATE"
,
"更新"
),
DELETE
(
"DELETE"
,
"删除"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList27
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[模板类型]
*/
@Getter
public
enum
TemplateType
{
ALIYUN_SUB_SMS
(
"aliyun-sms"
,
"阿里云短信"
),
ALIYUN_SUB_EMAIL
(
"aliyun-email"
,
"阿里云邮件"
),
WECHAT_SUB_MSG
(
"wechat-msg"
,
"微信消息"
),
DINGTALK_SUB_MSG
(
"dingtalk-msg"
,
"钉钉通知"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
TemplateType
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[平台内置处理组件类型]
*/
@Getter
public
enum
CodeList118
{
CODELISTFILLER
(
"CODELISTFILLER"
,
"代码表填充器"
),
WFPROCESS
(
"WFPROCESS"
,
"工作流嵌入处理"
),
DGACTIONHELPER
(
"DGACTIONHELPER"
,
"表格后台处理对象"
),
FORMACTIONHELPER
(
"FORMACTIONHELPER"
,
"表单后台处理类"
),
PAGE
(
"PAGE"
,
"页面对象"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList118
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[消息模板内容类型]
*/
@Getter
public
enum
CodeList42
{
TEXT
(
"TEXT"
,
"纯文本"
),
HTML
(
"HTML"
,
"HTML网页"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList42
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[字段查询扩展选项]
*/
@Getter
public
enum
CodeList60
{
LIKE
(
"LIKE"
,
"LIKE大小写敏感"
),
EQ
(
"="
,
"=(含其它)大小写敏感"
),
LIKESPLIT
(
"LIKESPLIT"
,
"LIKE分解"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList60
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[年份(2010~2020)]
*/
@Getter
public
enum
CodeList81
{
ITEM_2010
(
"2010"
,
"2010年"
),
ITEM_2011
(
"2011"
,
"2011年"
),
ITEM_2012
(
"2012"
,
"2012年"
),
ITEM_2013
(
"2013"
,
"2013年"
),
ITEM_2014
(
"2014"
,
"2014年"
),
ITEM_2015
(
"2015"
,
"2015年"
),
ITEM_2016
(
"2016"
,
"2016年"
),
ITEM_2017
(
"2017"
,
"2017年"
),
ITEM_2018
(
"2018"
,
"2018年"
),
ITEM_2019
(
"2019"
,
"2019年"
),
ITEM_2020
(
"2020"
,
"2020年"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList81
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[季度(1~4)]
*/
@Getter
public
enum
CodeList83
{
ITEM_1
(
"1"
,
"1季度"
),
ITEM_2
(
"2"
,
"2季度"
),
ITEM_3
(
"3"
,
"3季度"
),
ITEM_4
(
"4"
,
"4季度"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList83
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[树视图节点类型]
*/
@Getter
public
enum
CodeList94
{
STATIC
(
"STATIC"
,
"静态"
),
DE
(
"DE"
,
"动态(实体)"
),
CODELIST
(
"CODELIST"
,
"动态(代码表)"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList94
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[补字应用场合类型]
*/
@Getter
public
enum
CodeList30
{
GG
(
"GG"
,
"公共"
),
SH
(
"SH"
,
"审核"
),
PG
(
"PG"
,
"派工"
),
SABTYY
(
"SABTYY"
,
"SABTYY"
),
RKDSH
(
"RKDSH"
,
"入库单审核"
),
CKDSH
(
"CKDSH"
,
"出库单审核"
),
BSDSH
(
"BSDSH"
,
"报损单审核"
),
SAOA
(
"SAOA"
,
"SAOA"
),
FW
(
"FW"
,
"发文"
),
SW
(
"SW"
,
"收文"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList30
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[页面跳转处理_页面类型]
*/
@Getter
public
enum
CodeList113
{
PAGE
(
"PAGE"
,
"内置页面"
),
URL
(
"URL"
,
"网页路径"
),
SCRIPT
(
"SCRIPT"
,
"脚本"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList113
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[数据操作步骤]
*/
@Getter
public
enum
CodeList11
{
USERDECLARE
(
"USERDECLARE"
,
"变量定义"
),
USERINIT
(
"USERINIT"
,
"变量初始化"
),
INPUTCHECK
(
"INPUTCHECK"
,
"数据检查"
),
BEFOREACTION
(
"BEFOREACTION"
,
"操作之前"
),
EXECUTEACTION
(
"EXECUTEACTION"
,
"执行操作"
),
AFTERACTION
(
"AFTERACTION"
,
"操作之后"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList11
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[代码发布路径]
*/
@Getter
public
enum
CodeList116
{
DEFAULT
(
"DEFAULT"
,
"默认"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList116
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[年周(1~52)]
*/
@Getter
public
enum
CodeList84
{
ITEM_01
(
"01"
,
"第1周"
),
ITEM_02
(
"02"
,
"第2周"
),
ITEM_03
(
"03"
,
"第3周"
),
ITEM_04
(
"04"
,
"第4周"
),
ITEM_05
(
"05"
,
"第5周"
),
ITEM_06
(
"06"
,
"第6周"
),
ITEM_07
(
"07"
,
"第7周"
),
ITEM_08
(
"08"
,
"第8周"
),
ITEM_09
(
"09"
,
"第9周"
),
ITEM_10
(
"10"
,
"第10周"
),
ITEM_11
(
"11"
,
"第11周"
),
ITEM_12
(
"12"
,
"第12周"
),
ITEM_13
(
"13"
,
"第13周"
),
ITEM_14
(
"14"
,
"第14周"
),
ITEM_15
(
"15"
,
"第15周"
),
ITEM_16
(
"16"
,
"第16周"
),
ITEM_17
(
"17"
,
"第17周"
),
ITEM_18
(
"18"
,
"第18周"
),
ITEM_19
(
"19"
,
"第19周"
),
ITEM_20
(
"20"
,
"第20周"
),
ITEM_21
(
"21"
,
"第21周"
),
ITEM_22
(
"22"
,
"第22周"
),
ITEM_23
(
"23"
,
"第23周"
),
ITEM_24
(
"24"
,
"第24周"
),
ITEM_25
(
"25"
,
"第25周"
),
ITEM_26
(
"26"
,
"第26周"
),
ITEM_27
(
"27"
,
"第27周"
),
ITEM_28
(
"28"
,
"第28周"
),
ITEM_29
(
"29"
,
"第29周"
),
ITEM_30
(
"30"
,
"第30周"
),
ITEM_31
(
"31"
,
"第31周"
),
ITEM_32
(
"32"
,
"第32周"
),
ITEM_33
(
"33"
,
"第33周"
),
ITEM_34
(
"34"
,
"第34周"
),
ITEM_35
(
"35"
,
"第35周"
),
ITEM_36
(
"36"
,
"第36周"
),
ITEM_37
(
"37"
,
"第37周"
),
ITEM_38
(
"38"
,
"第38周"
),
ITEM_39
(
"39"
,
"第39周"
),
ITEM_40
(
"40"
,
"第40周"
),
ITEM_41
(
"41"
,
"第41周"
),
ITEM_42
(
"42"
,
"第42周"
),
ITEM_43
(
"43"
,
"第43周"
),
ITEM_44
(
"44"
,
"第44周"
),
ITEM_45
(
"45"
,
"第45周"
),
ITEM_46
(
"46"
,
"第46周"
),
ITEM_47
(
"47"
,
"第47周"
),
ITEM_48
(
"48"
,
"第48周"
),
ITEM_49
(
"49"
,
"第49周"
),
ITEM_50
(
"50"
,
"第50周"
),
ITEM_51
(
"51"
,
"第51周"
),
ITEM_52
(
"52"
,
"第52周"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList84
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[数据库触发器操作]
*/
@Getter
public
enum
CodeList65
{
BEFORE
(
"BEFORE"
,
"Before"
),
AFTER
(
"AFTER"
,
"After"
),
INSTEADOF
(
"INSTEADOF"
,
"Instead of"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList65
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[平台内置流程状态]
*/
@Getter
public
enum
WFStates
{
ITEM_0
(
"0"
,
"未启动"
),
ITEM_1
(
"1"
,
"流程中"
),
ITEM_2
(
"2"
,
"已完成"
),
ITEM_3
(
"3"
,
"已取消"
),
ITEM_31
(
"31"
,
"已取消(人工)"
),
ITEM_32
(
"32"
,
"已取消(超时)"
),
ITEM_4
(
"4"
,
"处理故障"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
WFStates
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[表单嵌入表格工具栏能力]
*/
@Getter
public
enum
CodeList77
{
INSERT
(
"INSERT"
,
"新建"
),
UPDATE
(
"UPDATE"
,
"更新"
),
DELETE
(
"DELETE"
,
"删除"
),
ROWEDIT
(
"ROWEDIT"
,
"启用行编辑"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList77
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[页面处理逻辑类型]
*/
@Getter
public
enum
CodeList70
{
AFTERINITPAGEPARAM
(
"AFTERINITPAGEPARAM"
,
"页面变量初始化之后"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList70
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[日期类型]
*/
@Getter
public
enum
CodeList48
{
ITEM_1
(
"1"
,
"每周"
),
ITEM_2
(
"2"
,
"每月"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList48
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[服务运行状态]
*/
@Getter
public
enum
CodeList38
{
START
(
"START"
,
"启动"
),
STOP
(
"STOP"
,
"停止"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList38
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[用户对象类型]
*/
@Getter
public
enum
CodeList5
{
USER
(
"USER"
,
"用户"
),
USERGROUP
(
"USERGROUP"
,
"用户组"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList5
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[DA日志操作类型]
*/
@Getter
public
enum
CodeList24
{
CREATE
(
"CREATE"
,
"新建"
),
UPDATE
(
"UPDATE"
,
"更新"
),
DELETE
(
"DELETE"
,
"删除"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList24
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[脚本功能]
*/
@Getter
public
enum
CodeList114
{
ITEM_1
(
"1"
,
"基础"
),
ITEM_128
(
"128"
,
"树视图常规"
),
ITEM_2
(
"2"
,
"树视图高级"
),
ITEM_4
(
"4"
,
"TAB视图"
),
ITEM_8
(
"8"
,
"动态面板"
),
ITEM_16
(
"16"
,
"搜索面板"
),
ITEM_32
(
"32"
,
"表格视图常规"
),
ITEM_64
(
"64"
,
"表格视图高级"
),
ITEM_256
(
"256"
,
"数据视图"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList114
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体快捷应用范围]
*/
@Getter
public
enum
CodeList41
{
ITEM_1
(
"1"
,
"拾取链接"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList41
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[是否(TRUE,FALSE)]
*/
@Getter
public
enum
TrueFalse
{
TRUE
(
"TRUE"
,
"是"
),
FALSE
(
"FALSE"
,
"否"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
TrueFalse
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[服务启动模式]
*/
@Getter
public
enum
CodeList37
{
AUTO
(
"AUTO"
,
"自动"
),
MANUAL
(
"MANUAL"
,
"手动"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList37
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体规则处理_操作逻辑]
*/
@Getter
public
enum
CodeList111
{
EQ
(
"="
,
"等于"
),
LTGT
(
"<>"
,
"不等于"
),
GTEQ
(
">="
,
"大于等于"
),
GT
(
">"
,
"大于"
),
LTEQ
(
"<="
,
"小于等于"
),
LT
(
"<"
,
"小于"
),
LIKE
(
"LIKE"
,
"文本匹配"
),
ISNULL
(
"ISNULL"
,
"为空"
),
ISNOTNULL
(
"ISNOTNULL"
,
"不为空"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList111
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[预定义属性类型]
*/
@Getter
public
enum
CodeList34
{
LOGICVALID
(
"LOGICVALID"
,
"逻辑有效标识"
),
CREATEMAN
(
"CREATEMAN"
,
"建立人"
),
CREATEDATE
(
"CREATEDATE"
,
"建立时间"
),
UPDATEMAN
(
"UPDATEMAN"
,
"更新人"
),
UPDATEDATE
(
"UPDATEDATE"
,
"更新时间"
),
ORGUNITID
(
"ORGUNITID"
,
"组织单元标识"
),
ORGUNITNAME
(
"ORGUNITNAME"
,
"组织单元名称"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList34
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[列编辑器样式]
*/
@Getter
public
enum
CodeList28
{
DROPDOWNLIST
(
"DROPDOWNLIST"
,
"下拉列表框"
),
PICKER
(
"PICKER"
,
"数据选择框"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList28
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[数据通知_时间条件]
*/
@Getter
public
enum
CodeList62
{
BEFORE
(
"BEFORE"
,
"之前"
),
AFTER
(
"AFTER"
,
"之后"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList62
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[网页部件类型]
*/
@Getter
public
enum
CodeList6
{
CHART
(
"CHART"
,
"图形部件"
),
LIST
(
"LIST"
,
"列表"
),
CUSTOMWP
(
"CUSTOMWP"
,
"自定义"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList6
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[星期(1~7)]
*/
@Getter
public
enum
CodeList46
{
ITEM_2
(
"2"
,
"星期一"
),
ITEM_3
(
"3"
,
"星期二"
),
ITEM_4
(
"4"
,
"星期三"
),
ITEM_5
(
"5"
,
"星期四"
),
ITEM_6
(
"6"
,
"星期五"
),
ITEM_7
(
"7"
,
"星期六"
),
ITEM_1
(
"1"
,
"星期日"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList46
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[DA日志对象类型]
*/
@Getter
public
enum
CodeList23
{
DATAENTITY
(
"DATAENTITY"
,
"实体"
),
DEFIELD
(
"DEFIELD"
,
"实体属性"
),
DER1N
(
"DER1N"
,
"实体关系"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList23
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[月周(1~5)]
*/
@Getter
public
enum
CodeList86
{
ITEM_1
(
"1"
,
"1周"
),
ITEM_2
(
"2"
,
"2周"
),
ITEM_3
(
"3"
,
"3周"
),
ITEM_4
(
"4"
,
"4周"
),
ITEM_5
(
"5"
,
"5周"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList86
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[数据库操作]
*/
@Getter
public
enum
CodeList89
{
INSERT
(
"INSERT"
,
"插入"
),
UPDATE
(
"UPDATE"
,
"更新"
),
DELETE
(
"DELETE"
,
"删除"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList89
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体属性更新模式]
*/
@Getter
public
enum
CodeList2
{
VERSION
(
"VERSION"
,
"版本模式"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList2
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[属性引用关系类型]
*/
@Getter
public
enum
CodeList90
{
DER1N
(
"DER1N"
,
"1:N关系"
),
DERCUSTOM
(
"DERCUSTOM"
,
"自定义关系"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList90
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体归属]
*/
@Getter
public
enum
CodeList19
{
SRFDA
(
"SRFDA"
,
"系统"
),
APPLICATION
(
"APPLICATION"
,
"应用"
),
USER
(
"USER"
,
"用户"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList19
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[DB2触发器代码模式]
*/
@Getter
public
enum
CodeList67
{
FOR_EACH_ROW
(
"For Each Row"
,
"For Each Row"
),
FOR_EACH_STATEMENT
(
"For Each Statement"
,
"For Each Statement"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList67
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[功能类型]
*/
@Getter
public
enum
CodeList4
{
DEDATAGRID
(
"DEDATAGRID"
,
"默认实体表格视图"
),
PAGELINK
(
"PAGELINK"
,
"页面链接"
),
JSCODE
(
"JSCODE"
,
"纯JS代码"
),
DEGRIDVIEW
(
"DEGRIDVIEW"
,
"指定实体表格视图"
),
PAGE
(
"PAGE"
,
"内置页面"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList4
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[输入辅助_消息模板宏]
*/
@Getter
public
enum
CodeList102
{
CARETTEMPLGROUP_SRFMSG_MSGTEMPLATE
(
"CARETTEMPLGROUP_SRFMSG_MSGTEMPLATE"
,
"消息模板"
),
CARETTEMPLGROUP_SRFDA_FILLENTITYPARAM
(
"CARETTEMPLGROUP_SRFDA_FILLENTITYPARAM"
,
"系统属性"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList102
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[代码表或模式]
*/
@Getter
public
enum
CodeList20
{
NUMBERORMODE
(
"NUMBERORMODE"
,
"数字或处理"
),
STRINGORMODE
(
"STRINGORMODE"
,
"文本或模式"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList20
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[是否(蓝、红)]
*/
@Getter
public
enum
CodeList50
{
ITEM_1
(
"1"
,
"是"
),
ITEM_0
(
"0"
,
"否"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList50
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[表格列构建器]
*/
@Getter
public
enum
CodeList9
{
NUMBER
(
"NUMBER"
,
"数值"
),
CODELIST
(
"CODELIST"
,
"代码表"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList9
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[消息类型]
*/
@Getter
public
enum
CodeList29
{
ITEM_1
(
"1"
,
"系统消息"
),
ITEM_2
(
"2"
,
"电子邮件"
),
ITEM_4
(
"4"
,
"手机短信"
),
ITEM_8
(
"8"
,
"MSN消息"
),
ITEM_16
(
"16"
,
"检务通消息"
),
ITEM_32
(
"32"
,
"微信"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList29
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[工作日类型]
*/
@Getter
public
enum
CodeList45
{
ITEM_1
(
"1"
,
"工作日"
),
ITEM_2
(
"2"
,
"非工作日"
),
ITEM_3
(
"3"
,
"自定义工作日"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList45
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[扩展表格单元格水平对齐方式]
*/
@Getter
public
enum
CodeList74
{
LEFT
(
"LEFT"
,
"左对齐"
),
CENTER
(
"CENTER"
,
"居中"
),
RIGHT
(
"RIGHT"
,
"右对齐"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList74
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[文件编码]
*/
@Getter
public
enum
CodeList39
{
ANSI
(
"ANSI"
,
"ANSI"
),
UTF_SUB_8
(
"UTF-8"
,
"UTF-8"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList39
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[输入辅助_控件参数]
*/
@Getter
public
enum
CodeList101
{
CARETTEMPLGROUP_SRFDA_CONTROLPARAM
(
"CARETTEMPLGROUP_SRFDA_CONTROLPARAM"
,
"控件基本参数"
),
CARETTEMPLGROUP_SRFDA_CONTROLPARAM_CARET
(
"CARETTEMPLGROUP_SRFDA_CONTROLPARAM_CARET"
,
"辅助输入控件参数"
),
CARETTEMPLGROUP_SRFDA_CONTROLPARAM_PICKUP
(
"CARETTEMPLGROUP_SRFDA_CONTROLPARAM_PICKUP"
,
"选择控件参数"
),
CARETTEMPLGROUP_SRFDA_CONTROLPARAM_TEXTBOX
(
"CARETTEMPLGROUP_SRFDA_CONTROLPARAM_TEXTBOX"
,
"文本控件参数"
),
CARETTEMPLGROUP_SRFDA_CONTROLPARAM_PICKUPLISTBOX
(
"CARETTEMPLGROUP_SRFDA_CONTROLPARAM_PICKUPLISTBOX"
,
"选择列表控件参数"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList101
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体属性表单默认值类型]
*/
@Getter
public
enum
CodeList3
{
SESSION
(
"SESSION"
,
"用户全局对象"
),
APPLICATION
(
"APPLICATION"
,
"系统全局对象"
),
UNIQUEID
(
"UNIQUEID"
,
"唯一编码"
),
CONTEXT
(
"CONTEXT"
,
"网页请求"
),
PARAM
(
"PARAM"
,
"数据对象属性"
),
OPERATOR
(
"OPERATOR"
,
"当前操作用户(编号)"
),
OPERATORNAME
(
"OPERATORNAME"
,
"当前操作用户(名称)"
),
CURTIME
(
"CURTIME"
,
"当前时间"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList3
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体属性插入模式]
*/
@Getter
public
enum
CodeList1
{
VERSION
(
"VERSION"
,
"版本模式"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList1
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[日志级别]
*/
@Getter
public
enum
CodeList32
{
ITEM_50000
(
"50000"
,
"致命(FATAL)"
),
ITEM_40000
(
"40000"
,
"错误(ERROR)"
),
ITEM_30000
(
"30000"
,
"警告(WARN)"
),
ITEM_20000
(
"20000"
,
"信息(INFO)"
),
ITEM_10000
(
"10000"
,
"调试(DEBUG)"
),
ITEM_5000
(
"5000"
,
"调试(TRACE)"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList32
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[时间维度类型]
*/
@Getter
public
enum
CodeList87
{
YM
(
"YM"
,
"年、月"
),
YMW
(
"YMW"
,
"年、月、周"
),
YMWD
(
"YMWD"
,
"年、月、周、天"
),
YMWDH
(
"YMWDH"
,
"年、月、周、天、小时"
),
YMD
(
"YMD"
,
"年、月、天"
),
YMDH
(
"YMDH"
,
"年、月、天、小时"
),
YW
(
"YW"
,
"年、周"
),
YWD
(
"YWD"
,
"年、周、天"
),
YWDH
(
"YWDH"
,
"年、周、天、小时"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList87
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[物理信息更新模式]
*/
@Getter
public
enum
CodeList57
{
UPDATEWHENMODIFY
(
"UPDATEWHENMODIFY"
,
"变更时更新"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList57
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[统一资源类型]
*/
@Getter
public
enum
CodeList16
{
PAGE
(
"PAGE"
,
"内置页面"
),
REPORT
(
"REPORT"
,
"报表"
),
CUSTOM
(
"CUSTOM"
,
"自定义"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList16
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[缩略界面类型]
*/
@Getter
public
enum
CodeList7
{
FORM
(
"FORM"
,
"表单"
),
PAGE
(
"PAGE"
,
"内置页面"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList7
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[周期时间类型]
*/
@Getter
public
enum
CodeList40
{
MONTH
(
"MONTH"
,
"月度"
),
SEASON
(
"SEASON"
,
"季度"
),
WEEK
(
"WEEK"
,
"周"
),
DAY
(
"DAY"
,
"天"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList40
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[消息类型]
*/
@Getter
public
enum
MsgType
{
ITEM_1
(
1
,
"系统消息"
),
ITEM_2
(
2
,
"电子邮件"
),
ITEM_4
(
4
,
"手机短信"
),
ITEM_32
(
32
,
"微信"
),
ITEM_64
(
64
,
"钉钉"
);
private
int
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
MsgType
(
int
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体数据操作]
*/
@Getter
public
enum
CodeList10
{
INSERT
(
"INSERT"
,
"插入"
),
UPDATE
(
"UPDATE"
,
"更新"
),
DELETE
(
"DELETE"
,
"删除"
),
SELECT
(
"SELECT"
,
"简单查询"
),
CUSTOMCALL
(
"CUSTOMCALL"
,
"自定义"
),
CUSTOMPROCCALL
(
"CUSTOMPROCCALL"
,
"自定义存储过程"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList10
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[补丁归属]
*/
@Getter
public
enum
CodeList36
{
ITEM_1
(
"1"
,
"框架基本"
),
ITEM_2
(
"2"
,
"框架高级"
),
ITEM_4
(
"4"
,
"工作流"
),
ITEM_8
(
"8"
,
"EAI"
),
ITEM_16
(
"16"
,
"UAC"
),
ITEM_32
(
"32"
,
"全文检索"
),
ITEM_64
(
"64"
,
"数据分析"
),
ITEM_128
(
"128"
,
"基础网盘"
),
ITEM_256
(
"256"
,
"基础组织"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList36
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[动态面板分区缩放样式]
*/
@Getter
public
enum
CodeList93
{
EXPAND
(
"EXPAND"
,
"展开"
),
COLLAPSE
(
"COLLAPSE"
,
"收缩"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList93
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[时间分组类型]
*/
@Getter
public
enum
CodeList92
{
Q
(
"Q"
,
"季度"
),
M
(
"M"
,
"月份"
),
D
(
"D"
,
"月天"
),
H
(
"H"
,
"小时"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList92
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体数据处理_数据对象操作]
*/
@Getter
public
enum
CodeList107
{
CREATENEW
(
"CREATENEW"
,
"新建数据对象"
),
CREATEFROM
(
"CREATEFROM"
,
"拷贝新建数据对象"
),
COPY
(
"COPY"
,
"拷贝数据对象"
),
COPYRESET
(
"COPYRESET"
,
"拷贝数据对象(重置)"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList107
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体属性访问控制]
*/
@Getter
public
enum
CodeList88
{
NONE
(
"NONE"
,
"无"
),
READ
(
"READ"
,
"读取"
),
UPDATE
(
"UPDATE"
,
"更新"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList88
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体存储类型]
*/
@Getter
public
enum
CodeList80
{
STATIC
(
"STATIC"
,
"静态存储"
),
DYNAMIC
(
"DYNAMIC"
,
"动态存储"
),
NONE
(
"NONE"
,
"无存储"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList80
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[图表控件_表格位置]
*/
@Getter
public
enum
CodeList52
{
NONE
(
"NONE"
,
"无表格"
),
TOPLEFT
(
"TOPLEFT"
,
"上左"
),
TOP
(
"TOP"
,
"上中"
),
TOPRIGHT
(
"TOPRIGHT"
,
"上右"
),
BOTTOMLEFT
(
"BOTTOMLEFT"
,
"下左"
),
BOTTOM
(
"BOTTOM"
,
"下中"
),
BOTTOMRIGHT
(
"BOTTOMRIGHT"
,
"下右"
),
LEFTTOP
(
"LEFTTOP"
,
"左上"
),
LEFT
(
"LEFT"
,
"左中"
),
LEFTBOTTOM
(
"LEFTBOTTOM"
,
"左下"
),
RIGHTTOP
(
"RIGHTTOP"
,
"右上"
),
RIGHT
(
"RIGHT"
,
"右中"
),
RIGHTBOTTOM
(
"RIGHTBOTTOM"
,
"右下"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList52
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[日历、邮件重要程度]
*/
@Getter
public
enum
CodeList8
{
HIGH
(
"HIGH"
,
"高"
),
NORMAL
(
"NORMAL"
,
"普通"
),
LOW
(
"LOW"
,
"低"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList8
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[输入辅助_实体处理逻辑代码]
*/
@Getter
public
enum
CodeList103
{
CARETTEMPLGROUP_SRFDA_DEDCCONTEXT
(
"CARETTEMPLGROUP_SRFDA_DEDCCONTEXT"
,
"实体处理逻辑引擎"
),
CARETTEMPLGROUP_SRFDA_DEACTION
(
"CARETTEMPLGROUP_SRFDA_DEACTION"
,
"实体属性操作"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList103
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[系统错误代码]
*/
@Getter
public
enum
CodeList35
{
ITEM_0
(
"0"
,
"正确(0)"
),
ITEM_1
(
"1"
,
"内部发生错误(INTERNALERROR)"
),
ITEM_2
(
"2"
,
"访问被拒绝(ACCESSDENY)"
),
ITEM_3
(
"3"
,
"无效的数据(INVALIDDATA)"
),
ITEM_4
(
"4"
,
"无效的数据键(INVALIDDATAKEYS)"
),
ITEM_5
(
"5"
,
"输入的信息有误(INPUTERROR)"
),
ITEM_6
(
"6"
,
"重复的数据键值(DUPLICATEKEY)"
),
ITEM_7
(
"7"
,
"重复的数据(DUPLICATEDATA)"
),
ITEM_8
(
"8"
,
"删除拒绝(DELETEREJECT)"
),
ITEM_9
(
"9"
,
"逻辑处理错误(LOGICERROR)"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList35
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[语言资源类型]
*/
@Getter
public
enum
CodeList55
{
DEF_LNAME
(
"DEF.LNAME"
,
"实体属性逻辑名称"
),
CL_ITEM_LNAME
(
"CL.ITEM.LNAME"
,
"代码表项"
),
TBB_TEXT
(
"TBB.TEXT"
,
"工具栏按钮文本"
),
TBB_TOOLTIP
(
"TBB.TOOLTIP"
,
"工具栏按钮提示"
),
MENUITEM_CAPTION
(
"MENUITEM.CAPTION"
,
"菜单项文本"
),
PAGE_HEADER
(
"PAGE.HEADER"
,
"界面头部标题"
),
PAGE_COMMON
(
"PAGE.COMMON"
,
"界面常规"
),
CONTROL
(
"CONTROL"
,
"控件文本"
),
ERROR_STD
(
"ERROR.STD"
,
"标准错误"
),
CTRL
(
"CTRL"
,
"处理逻辑"
),
COMMON
(
"COMMON"
,
"通用"
),
OTHER
(
"OTHER"
,
"其它"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList55
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[数据库类型]
*/
@Getter
public
enum
CodeList33
{
DB2
(
"DB2"
,
"DB2"
),
ORACLE
(
"ORACLE"
,
"ORACLE"
),
MSSQL
(
"MSSQL"
,
"MSSQLSERVER"
),
MYSQL
(
"MYSQL"
,
"MySQL"
),
SYBASE
(
"SYBASE"
,
"SYBASE"
),
INFORMIX
(
"INFORMIX"
,
"INFORMIX"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList33
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[时区]
*/
@Getter
public
enum
CodeList59
{
ETC_GMT_ADD_12
(
"Etc/GMT+12"
,
"(UTC-12:00)GMT-12:00"
),
ETC_GMT_ADD_11
(
"Etc/GMT+11"
,
"(UTC-11:00)GMT-11:00"
),
MIT
(
"MIT"
,
"(UTC-11:00)West Samoa Time"
),
PACIFIC_MIDWAY
(
"Pacific/Midway"
,
"(UTC-11:00)Samoa Standard Time"
),
PACIFIC_NIUE
(
"Pacific/Niue"
,
"(UTC-11:00)Niue Time"
),
AMERICA_ADAK
(
"America/Adak"
,
"(UTC-10:00)Hawaii-Aleutian Standard Time"
),
ETC_GMT_ADD_10
(
"Etc/GMT+10"
,
"(UTC-10:00)GMT-10:00"
),
HST
(
"HST"
,
"(UTC-10:00)Hawaii Standard Time"
),
PACIFIC_FAKAOFO
(
"Pacific/Fakaofo"
,
"(UTC-10:00)Tokelau Time"
),
PACIFIC_RAROTONGA
(
"Pacific/Rarotonga"
,
"(UTC-10:00)Cook Is. Time"
),
PACIFIC_TAHITI
(
"Pacific/Tahiti"
,
"(UTC-10:00)Tahiti Time"
),
PACIFIC_MARQUESAS
(
"Pacific/Marquesas"
,
"(UTC-9:00)Marquesas Time"
),
AST
(
"AST"
,
"(UTC-9:00)Alaska Standard Time"
),
ETC_GMT_ADD_9
(
"Etc/GMT+9"
,
"(UTC-9:00)GMT-09:00"
),
PACIFIC_GAMBIER
(
"Pacific/Gambier"
,
"(UTC-9:00)Gambier Time"
),
AMERICA_DAWSON
(
"America/Dawson"
,
"(UTC-8:00)Pacific Standard Time"
),
ETC_GMT_ADD_8
(
"Etc/GMT+8"
,
"(UTC-8:00)GMT-08:00"
),
PACIFIC_PITCAIRN
(
"Pacific/Pitcairn"
,
"(UTC-8:00)Pitcairn Standard Time"
),
AMERICA_BOISE
(
"America/Boise"
,
"(UTC-7:00)Mountain Standard Time"
),
ETC_GMT_ADD_7
(
"Etc/GMT+7"
,
"(UTC-7:00)GMT-07:00"
),
AMERICA_BELIZE
(
"America/Belize"
,
"(UTC-6:00)Central Standard Time"
),
CHILE_EASTERISLAND
(
"Chile/EasterIsland"
,
"(UTC-6:00)Easter Is. Time"
),
ETC_GMT_ADD_6
(
"Etc/GMT+6"
,
"(UTC-6:00)GMT-06:00"
),
PACIFIC_GALAPAGOS
(
"Pacific/Galapagos"
,
"(UTC-6:00)Galapagos Time"
),
AMERICA_ATIKOKAN
(
"America/Atikokan"
,
"(UTC-5:00)Eastern Standard Time"
),
AMERICA_BOGOTA
(
"America/Bogota"
,
"(UTC-5:00)Colombia Time"
),
AMERICA_EIRUNEPE
(
"America/Eirunepe"
,
"(UTC-5:00)Acre Time"
),
AMERICA_GUAYAQUIL
(
"America/Guayaquil"
,
"(UTC-5:00)Ecuador Time"
),
AMERICA_HAVANA
(
"America/Havana"
,
"(UTC-5:00)Cuba Standard Time"
),
AMERICA_LIMA
(
"America/Lima"
,
"(UTC-5:00)Peru Time"
),
ETC_GMT_ADD_5
(
"Etc/GMT+5"
,
"(UTC-5:00)GMT-05:00"
),
AMERICA_CARACAS
(
"America/Caracas"
,
"(UTC-4:00)Venezuela Time"
),
AMERICA_ANGUILLA
(
"America/Anguilla"
,
"(UTC-4:00)Atlantic Standard Time"
),
AMERICA_ASUNCION
(
"America/Asuncion"
,
"(UTC-4:00)Paraguay Time"
),
AMERICA_BOA_VISTA
(
"America/Boa_Vista"
,
"(UTC-4:00)Amazon Time"
),
AMERICA_GUYANA
(
"America/Guyana"
,
"(UTC-4:00)Guyana Time"
),
AMERICA_LA_PAZ
(
"America/La_Paz"
,
"(UTC-4:00)Bolivia Time"
),
AMERICA_SANTIAGO
(
"America/Santiago"
,
"(UTC-4:00)Chile Time"
),
ATLANTIC_STANLEY
(
"Atlantic/Stanley"
,
"(UTC-4:00)Falkland Is. Time"
),
ETC_GMT_ADD_4
(
"Etc/GMT+4"
,
"(UTC-4:00)GMT-04:00"
),
AMERICA_ST_JOHNS
(
"America/St_Johns"
,
"(UTC-3:00)Newfoundland Standard Time"
),
AGT
(
"AGT"
,
"(UTC-3:00)Argentine Time"
),
AMERICA_ARAGUAINA
(
"America/Araguaina"
,
"(UTC-3:00)Brasilia Time"
),
AMERICA_CAYENNE
(
"America/Cayenne"
,
"(UTC-3:00)French Guiana Time"
),
AMERICA_GODTHAB
(
"America/Godthab"
,
"(UTC-3:00)Western Greenland Time"
),
AMERICA_MIQUELON
(
"America/Miquelon"
,
"(UTC-3:00)Pierre & Miquelon Standard Time"
),
AMERICA_MONTEVIDEO
(
"America/Montevideo"
,
"(UTC-3:00)Uruguay Time"
),
AMERICA_PARAMARIBO
(
"America/Paramaribo"
,
"(UTC-3:00)Suriname Time"
),
ANTARCTICA_ROTHERA
(
"Antarctica/Rothera"
,
"(UTC-3:00)Rothera Time"
),
ETC_GMT_ADD_3
(
"Etc/GMT+3"
,
"(UTC-3:00)GMT-03:00"
),
AMERICA_NORONHA
(
"America/Noronha"
,
"(UTC-2:00)Fernando de Noronha Time"
),
ATLANTIC_SOUTH_GEORGIA
(
"Atlantic/South_Georgia"
,
"(UTC-2:00)South Georgia Standard Time"
),
ETC_GMT_ADD_2
(
"Etc/GMT+2"
,
"(UTC-2:00)GMT-02:00"
),
AMERICA_SCORESBYSUND
(
"America/Scoresbysund"
,
"(UTC-1:00)Eastern Greenland Time"
),
ATLANTIC_AZORES
(
"Atlantic/Azores"
,
"(UTC-1:00)Azores Time"
),
ATLANTIC_CAPE_VERDE
(
"Atlantic/Cape_Verde"
,
"(UTC-1:00)Cape Verde Time"
),
ETC_GMT_ADD_1
(
"Etc/GMT+1"
,
"(UTC-1:00)GMT-01:00"
),
AFRICA_ABIDJAN
(
"Africa/Abidjan"
,
"(UTC0:00)Greenwich Mean Time"
),
AFRICA_ACCRA
(
"Africa/Accra"
,
"(UTC0:00)Ghana Mean Time"
),
AFRICA_CASABLANCA
(
"Africa/Casablanca"
,
"(UTC0:00)Western European Time"
),
ETC_GMT
(
"Etc/GMT"
,
"(UTC0:00)GMT+00:00"
),
ETC_UCT
(
"Etc/UCT"
,
"(UTC0:00)Coordinated Universal Time"
),
AFRICA_ALGIERS
(
"Africa/Algiers"
,
"(UTC+1:00)Central European Time"
),
AFRICA_BANGUI
(
"Africa/Bangui"
,
"(UTC+1:00)Western African Time"
),
ETC_GMT_SUB_1
(
"Etc/GMT-1"
,
"(UTC+1:00)GMT+01:00"
),
MET
(
"MET"
,
"(UTC+1:00)Middle Europe Time"
),
ART
(
"ART"
,
"(UTC+2:00)Eastern European Time"
),
AFRICA_BLANTYRE
(
"Africa/Blantyre"
,
"(UTC+2:00)Central African Time"
),
AFRICA_JOHANNESBURG
(
"Africa/Johannesburg"
,
"(UTC+2:00)South Africa Standard Time"
),
ASIA_JERUSALEM
(
"Asia/Jerusalem"
,
"(UTC+2:00)Israel Standard Time"
),
ETC_GMT_SUB_2
(
"Etc/GMT-2"
,
"(UTC+2:00)GMT+02:00"
),
AFRICA_ADDIS_ABABA
(
"Africa/Addis_Ababa"
,
"(UTC+3:00)Eastern African Time"
),
ANTARCTICA_SYOWA
(
"Antarctica/Syowa"
,
"(UTC+3:00)Syowa Time"
),
ASIA_ADEN
(
"Asia/Aden"
,
"(UTC+3:00)Arabia Standard Time"
),
ETC_GMT_SUB_3
(
"Etc/GMT-3"
,
"(UTC+3:00)GMT+03:00"
),
EUROPE_MOSCOW
(
"Europe/Moscow"
,
"(UTC+3:00)Moscow Standard Time"
),
EUROPE_VOLGOGRAD
(
"Europe/Volgograd"
,
"(UTC+3:00)Volgograd Time"
),
ASIA_RIYADH87
(
"Asia/Riyadh87"
,
"(UTC+3:00)GMT+03:07"
),
ASIA_TEHRAN
(
"Asia/Tehran"
,
"(UTC+3:00)Iran Standard Time"
),
ASIA_BAKU
(
"Asia/Baku"
,
"(UTC+4:00)Azerbaijan Time"
),
ASIA_DUBAI
(
"Asia/Dubai"
,
"(UTC+4:00)Gulf Standard Time"
),
ASIA_TBILISI
(
"Asia/Tbilisi"
,
"(UTC+4:00)Georgia Time"
),
ASIA_YEREVAN
(
"Asia/Yerevan"
,
"(UTC+4:00)Armenia Time"
),
ETC_GMT_SUB_4
(
"Etc/GMT-4"
,
"(UTC+4:00)GMT+04:00"
),
EUROPE_SAMARA
(
"Europe/Samara"
,
"(UTC+4:00)Samara Time"
),
INDIAN_MAHE
(
"Indian/Mahe"
,
"(UTC+4:00)Seychelles Time"
),
INDIAN_MAURITIUS
(
"Indian/Mauritius"
,
"(UTC+4:00)Mauritius Time"
),
INDIAN_REUNION
(
"Indian/Reunion"
,
"(UTC+4:00)Reunion Time"
),
ASIA_KABUL
(
"Asia/Kabul"
,
"(UTC+4:00)Afghanistan Time"
),
ASIA_AQTAU
(
"Asia/Aqtau"
,
"(UTC+5:00)Aqtau Time"
),
ASIA_AQTOBE
(
"Asia/Aqtobe"
,
"(UTC+5:00)Aqtobe Time"
),
ASIA_ASHGABAT
(
"Asia/Ashgabat"
,
"(UTC+5:00)Turkmenistan Time"
),
ASIA_DUSHANBE
(
"Asia/Dushanbe"
,
"(UTC+5:00)Tajikistan Time"
),
ASIA_KARACHI
(
"Asia/Karachi"
,
"(UTC+5:00)Pakistan Time"
),
ASIA_ORAL
(
"Asia/Oral"
,
"(UTC+5:00)Oral Time"
),
ASIA_SAMARKAND
(
"Asia/Samarkand"
,
"(UTC+5:00)Uzbekistan Time"
),
ASIA_YEKATERINBURG
(
"Asia/Yekaterinburg"
,
"(UTC+5:00)Yekaterinburg Time"
),
ETC_GMT_SUB_5
(
"Etc/GMT-5"
,
"(UTC+5:00)GMT+05:00"
),
INDIAN_KERGUELEN
(
"Indian/Kerguelen"
,
"(UTC+5:00)French Southern & Antarctic Lands Time"
),
INDIAN_MALDIVES
(
"Indian/Maldives"
,
"(UTC+5:00)Maldives Time"
),
ASIA_CALCUTTA
(
"Asia/Calcutta"
,
"(UTC+5:00)India Standard Time"
),
ASIA_KATMANDU
(
"Asia/Katmandu"
,
"(UTC+5:00)Nepal Time"
),
ANTARCTICA_MAWSON
(
"Antarctica/Mawson"
,
"(UTC+6:00)Mawson Time"
),
ANTARCTICA_VOSTOK
(
"Antarctica/Vostok"
,
"(UTC+6:00)Vostok Time"
),
ASIA_ALMATY
(
"Asia/Almaty"
,
"(UTC+6:00)Alma-Ata Time"
),
ASIA_BISHKEK
(
"Asia/Bishkek"
,
"(UTC+6:00)Kirgizstan Time"
),
ASIA_DACCA
(
"Asia/Dacca"
,
"(UTC+6:00)Bangladesh Time"
),
ASIA_NOVOSIBIRSK
(
"Asia/Novosibirsk"
,
"(UTC+6:00)Novosibirsk Time"
),
ASIA_OMSK
(
"Asia/Omsk"
,
"(UTC+6:00)Omsk Time"
),
ASIA_QYZYLORDA
(
"Asia/Qyzylorda"
,
"(UTC+6:00)Qyzylorda Time"
),
ASIA_THIMBU
(
"Asia/Thimbu"
,
"(UTC+6:00)Bhutan Time"
),
ETC_GMT_SUB_6
(
"Etc/GMT-6"
,
"(UTC+6:00)GMT+06:00"
),
INDIAN_CHAGOS
(
"Indian/Chagos"
,
"(UTC+6:00)Indian Ocean Territory Time"
),
ASIA_RANGOON
(
"Asia/Rangoon"
,
"(UTC+6:00)Myanmar Time"
),
INDIAN_COCOS
(
"Indian/Cocos"
,
"(UTC+6:00)Cocos Islands Time"
),
ANTARCTICA_DAVIS
(
"Antarctica/Davis"
,
"(UTC+7:00)Davis Time"
),
ASIA_BANGKOK
(
"Asia/Bangkok"
,
"(UTC+7:00)Indochina Time"
),
ASIA_HOVD
(
"Asia/Hovd"
,
"(UTC+7:00)Hovd Time"
),
ASIA_JAKARTA
(
"Asia/Jakarta"
,
"(UTC+7:00)West Indonesia Time"
),
ASIA_KRASNOYARSK
(
"Asia/Krasnoyarsk"
,
"(UTC+7:00)Krasnoyarsk Time"
),
ETC_GMT_SUB_7
(
"Etc/GMT-7"
,
"(UTC+7:00)GMT+07:00"
),
INDIAN_CHRISTMAS
(
"Indian/Christmas"
,
"(UTC+7:00)Christmas Island Time"
),
ANTARCTICA_CASEY
(
"Antarctica/Casey"
,
"(UTC+8:00)Western Standard Time (Australia)"
),
ASIA_BRUNEI
(
"Asia/Brunei"
,
"(UTC+8:00)Brunei Time"
),
ASIA_CHOIBALSAN
(
"Asia/Choibalsan"
,
"(UTC+8:00)Choibalsan Time"
),
ASIA_SHANGHAI
(
"Asia/Shanghai"
,
"(UTC+8:00)China Standard Time"
),
ASIA_HONG_KONG
(
"Asia/Hong_Kong"
,
"(UTC+8:00)Hong Kong Time"
),
ASIA_IRKUTSK
(
"Asia/Irkutsk"
,
"(UTC+8:00)Irkutsk Time"
),
ASIA_KUALA_LUMPUR
(
"Asia/Kuala_Lumpur"
,
"(UTC+8:00)Malaysia Time"
),
ASIA_MAKASSAR
(
"Asia/Makassar"
,
"(UTC+8:00)Central Indonesia Time"
),
ASIA_MANILA
(
"Asia/Manila"
,
"(UTC+8:00)Philippines Time"
),
ASIA_SINGAPORE
(
"Asia/Singapore"
,
"(UTC+8:00)Singapore Time"
),
ASIA_ULAANBAATAR
(
"Asia/Ulaanbaatar"
,
"(UTC+8:00)Ulaanbaatar Time"
),
ETC_GMT_SUB_8
(
"Etc/GMT-8"
,
"(UTC+8:00)GMT+08:00"
),
AUSTRALIA_EUCLA
(
"Australia/Eucla"
,
"(UTC+8:00)Central Western Standard Time (Australia)"
),
ASIA_DILI
(
"Asia/Dili"
,
"(UTC+9:00)Timor-Leste Time"
),
ASIA_JAYAPURA
(
"Asia/Jayapura"
,
"(UTC+9:00)East Indonesia Time"
),
ASIA_PYONGYANG
(
"Asia/Pyongyang"
,
"(UTC+9:00)Korea Standard Time"
),
ASIA_TOKYO
(
"Asia/Tokyo"
,
"(UTC+9:00)Japan Standard Time"
),
ASIA_YAKUTSK
(
"Asia/Yakutsk"
,
"(UTC+9:00)Yakutsk Time"
),
ETC_GMT_SUB_9
(
"Etc/GMT-9"
,
"(UTC+9:00)GMT+09:00"
),
PACIFIC_PALAU
(
"Pacific/Palau"
,
"(UTC+9:00)Palau Time"
),
ACT
(
"ACT"
,
"(UTC+9:00)Central Standard Time (Northern Territory)"
),
AUSTRALIA_ADELAIDE
(
"Australia/Adelaide"
,
"(UTC+9:00)Central Standard Time (South Australia)"
),
AUSTRALIA_BROKEN_HILL
(
"Australia/Broken_Hill"
,
"(UTC+9:00)Central Standard Time (South Australia/New South Wales)"
),
AET
(
"AET"
,
"(UTC+10:00)Eastern Standard Time (New South Wales)"
),
ANTARCTICA_DUMONTDURVILLE
(
"Antarctica/DumontDUrville"
,
"(UTC+10:00)Dumont-d|Urville Time"
),
ASIA_SAKHALIN
(
"Asia/Sakhalin"
,
"(UTC+10:00)Sakhalin Time"
),
ASIA_VLADIVOSTOK
(
"Asia/Vladivostok"
,
"(UTC+10:00)Vladivostok Time"
),
AUSTRALIA_BRISBANE
(
"Australia/Brisbane"
,
"(UTC+10:00)Eastern Standard Time (Queensland)"
),
AUSTRALIA_HOBART
(
"Australia/Hobart"
,
"(UTC+10:00)Eastern Standard Time (Tasmania)"
),
AUSTRALIA_MELBOURNE
(
"Australia/Melbourne"
,
"(UTC+10:00)Eastern Standard Time (Victoria)"
),
ETC_GMT_SUB_10
(
"Etc/GMT-10"
,
"(UTC+10:00)GMT+10:00"
),
PACIFIC_GUAM
(
"Pacific/Guam"
,
"(UTC+10:00)Chamorro Standard Time"
),
PACIFIC_PORT_MORESBY
(
"Pacific/Port_Moresby"
,
"(UTC+10:00)Papua New Guinea Time"
),
PACIFIC_TRUK
(
"Pacific/Truk"
,
"(UTC+10:00)Truk Time"
),
AUSTRALIA_LHI
(
"Australia/LHI"
,
"(UTC+10:00)Lord Howe Standard Time"
),
ASIA_MAGADAN
(
"Asia/Magadan"
,
"(UTC+11:00)Magadan Time"
),
ETC_GMT_SUB_11
(
"Etc/GMT-11"
,
"(UTC+11:00)GMT+11:00"
),
PACIFIC_EFATE
(
"Pacific/Efate"
,
"(UTC+11:00)Vanuatu Time"
),
PACIFIC_GUADALCANAL
(
"Pacific/Guadalcanal"
,
"(UTC+11:00)Solomon Is. Time"
),
PACIFIC_KOSRAE
(
"Pacific/Kosrae"
,
"(UTC+11:00)Kosrae Time"
),
PACIFIC_NOUMEA
(
"Pacific/Noumea"
,
"(UTC+11:00)New Caledonia Time"
),
PACIFIC_PONAPE
(
"Pacific/Ponape"
,
"(UTC+11:00)Ponape Time"
),
PACIFIC_NORFOLK
(
"Pacific/Norfolk"
,
"(UTC+11:00)Norfolk Time"
),
ANTARCTICA_MCMURDO
(
"Antarctica/McMurdo"
,
"(UTC+12:00)New Zealand Standard Time"
),
ASIA_ANADYR
(
"Asia/Anadyr"
,
"(UTC+12:00)Anadyr Time"
),
ASIA_KAMCHATKA
(
"Asia/Kamchatka"
,
"(UTC+12:00)Petropavlovsk-Kamchatski Time"
),
ETC_GMT_SUB_12
(
"Etc/GMT-12"
,
"(UTC+12:00)GMT+12:00"
),
KWAJALEIN
(
"Kwajalein"
,
"(UTC+12:00)Marshall Islands Time"
),
PACIFIC_FIJI
(
"Pacific/Fiji"
,
"(UTC+12:00)Fiji Time"
),
PACIFIC_FUNAFUTI
(
"Pacific/Funafuti"
,
"(UTC+12:00)Tuvalu Time"
),
PACIFIC_NAURU
(
"Pacific/Nauru"
,
"(UTC+12:00)Nauru Time"
),
PACIFIC_TARAWA
(
"Pacific/Tarawa"
,
"(UTC+12:00)Gilbert Is. Time"
),
PACIFIC_WAKE
(
"Pacific/Wake"
,
"(UTC+12:00)Wake Time"
),
PACIFIC_WALLIS
(
"Pacific/Wallis"
,
"(UTC+12:00)Wallis & Futuna Time"
),
NZ_SUB_CHAT
(
"NZ-CHAT"
,
"(UTC+12:00)Chatham Standard Time"
),
ETC_GMT_SUB_13
(
"Etc/GMT-13"
,
"(UTC+13:00)GMT+13:00"
),
PACIFIC_ENDERBURY
(
"Pacific/Enderbury"
,
"(UTC+13:00)Phoenix Is. Time"
),
PACIFIC_TONGATAPU
(
"Pacific/Tongatapu"
,
"(UTC+13:00)Tonga Time"
),
ETC_GMT_SUB_14
(
"Etc/GMT-14"
,
"(UTC+14:00)GMT+14:00"
),
PACIFIC_KIRITIMATI
(
"Pacific/Kiritimati"
,
"(UTC+14:00)Line Is. Time"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList59
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[输入辅助_图表参数]
*/
@Getter
public
enum
CodeList104
{
CARETTEMPLGROUP_SRFREPORT_CHARTDATA
(
"CARETTEMPLGROUP_SRFREPORT_CHARTDATA"
,
"图表数据定义"
),
CARETTEMPLGROUP_SRFREPORT_CHART
(
"CARETTEMPLGROUP_SRFREPORT_CHART"
,
"图表表现定义"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList104
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[民族(公安部身份证)]
*/
@Getter
public
enum
CodeList99
{
ITEM_01
(
"01"
,
"汉"
),
ITEM_02
(
"02"
,
"蒙古"
),
ITEM_03
(
"03"
,
"回"
),
ITEM_04
(
"04"
,
"藏"
),
ITEM_05
(
"05"
,
"维吾尔"
),
ITEM_06
(
"06"
,
"苗"
),
ITEM_07
(
"07"
,
"彝"
),
ITEM_08
(
"08"
,
"壮"
),
ITEM_09
(
"09"
,
"布依"
),
ITEM_10
(
"10"
,
"朝鲜"
),
ITEM_11
(
"11"
,
"满"
),
ITEM_12
(
"12"
,
"侗"
),
ITEM_13
(
"13"
,
"瑶"
),
ITEM_14
(
"14"
,
"白"
),
ITEM_15
(
"15"
,
"土家"
),
ITEM_16
(
"16"
,
"哈尼"
),
ITEM_17
(
"17"
,
"哈萨克"
),
ITEM_18
(
"18"
,
"傣"
),
ITEM_19
(
"19"
,
"黎"
),
ITEM_20
(
"20"
,
"傈僳"
),
ITEM_21
(
"21"
,
"佤"
),
ITEM_22
(
"22"
,
"畲"
),
ITEM_23
(
"23"
,
"高山"
),
ITEM_24
(
"24"
,
"拉祜"
),
ITEM_25
(
"25"
,
"水"
),
ITEM_26
(
"26"
,
"东乡"
),
ITEM_27
(
"27"
,
"纳西"
),
ITEM_28
(
"28"
,
"景颇"
),
ITEM_29
(
"29"
,
"柯尔克孜"
),
ITEM_30
(
"30"
,
"土"
),
ITEM_31
(
"31"
,
"达斡尔"
),
ITEM_32
(
"32"
,
"仫佬"
),
ITEM_33
(
"33"
,
"羌"
),
ITEM_34
(
"34"
,
"布朗"
),
ITEM_35
(
"35"
,
"撒拉"
),
ITEM_36
(
"36"
,
"毛南"
),
ITEM_37
(
"37"
,
"仡佬"
),
ITEM_38
(
"38"
,
"锡伯"
),
ITEM_39
(
"39"
,
"阿昌"
),
ITEM_40
(
"40"
,
"普米"
),
ITEM_41
(
"41"
,
"塔吉克"
),
ITEM_42
(
"42"
,
"怒"
),
ITEM_43
(
"43"
,
"乌孜别克"
),
ITEM_44
(
"44"
,
"俄罗斯"
),
ITEM_45
(
"45"
,
"鄂温克"
),
ITEM_46
(
"46"
,
"德昂"
),
ITEM_47
(
"47"
,
"保安"
),
ITEM_48
(
"48"
,
"裕固"
),
ITEM_49
(
"49"
,
"京"
),
ITEM_50
(
"50"
,
"塔塔尔"
),
ITEM_51
(
"51"
,
"独龙"
),
ITEM_52
(
"52"
,
"鄂伦春"
),
ITEM_53
(
"53"
,
"赫哲"
),
ITEM_54
(
"54"
,
"门巴"
),
ITEM_55
(
"55"
,
"珞巴"
),
ITEM_56
(
"56"
,
"基诺"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList99
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[主实体删除关系实体操作]
*/
@Getter
public
enum
CodeList21
{
ITEM_1
(
"1"
,
"同时删除"
),
ITEM_2
(
"2"
,
"置空"
),
ITEM_3
(
"3"
,
"限制删除"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList21
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体数据处理_数据操作]
*/
@Getter
public
enum
CodeList108
{
INSERT
(
"INSERT"
,
"新建"
),
UPDATE
(
"UPDATE"
,
"更新"
),
SAVE
(
"SAVE"
,
"保存(自动判断)"
),
DELETE
(
"DELETE"
,
"删除"
),
CUSTOMCALL
(
"CUSTOMCALL"
,
"自定义调用"
),
CUSTOMPROCCALL
(
"CUSTOMPROCCALL"
,
"自定义存储过程调用"
),
CUSTOMRAWPROCCALL
(
"CUSTOMRAWPROCCALL"
,
"自定义存储过程调用(全称)"
),
GET
(
"GET"
,
"获取(GET)"
),
CHECKKEYSTATE
(
"CHECKKEYSTATE"
,
"检查主键状态(CHECKKEYSTATE)"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList108
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[前端展现技术]
*/
@Getter
public
enum
CodeList96
{
HTML
(
"HTML"
,
"HTML"
),
SL
(
"SL"
,
"SilverLight"
),
WINRT
(
"WinRT"
,
"WinRT"
),
ANDROID
(
"Android"
,
"Android"
),
IOS
(
"IOS"
,
"IOS"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList96
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体规则处理_数据类型]
*/
@Getter
public
enum
CodeList112
{
VARCHAR
(
"VARCHAR"
,
"文本"
),
INT
(
"INT"
,
"整形"
),
FLOAT
(
"FLOAT"
,
"浮点"
),
DATETIME
(
"DATETIME"
,
"日期"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList112
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体关系明细类型]
*/
@Getter
public
enum
CodeList14
{
PAGE
(
"PAGE"
,
"内建页面"
),
PAGEPATH
(
"PAGEPATH"
,
"页面路径"
),
DER1N
(
"DER1N"
,
"1:N关系"
),
DER11
(
"DER11"
,
"1:1关系"
),
WFSTEP
(
"WFSTEP"
,
"工作流处理步骤"
),
WFSTEPACTOR
(
"WFSTEPACTOR"
,
"工作流当前处理用户"
),
FILELIST
(
"FILELIST"
,
"附件列表"
),
DATAAUDIT
(
"DATAAUDIT"
,
"行为审计"
),
DERTYPE
(
"DERTYPE"
,
"实体关系分组"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList14
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[本地语言]
*/
@Getter
public
enum
CodeList56
{
EN
(
"EN"
,
"英文"
),
ZH_CN
(
"ZH_CN"
,
"中文简体"
),
ZH_TW
(
"ZH_TW"
,
"中文繁体(台湾)"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList56
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[输入辅助_页面参数]
*/
@Getter
public
enum
CodeList100
{
CARETTEMPLGROUP_SRFDA_PAGEPARAM
(
"CARETTEMPLGROUP_SRFDA_PAGEPARAM"
,
"常规页面参数"
),
CARETTEMPLGROUP_SRFDA_GRIDVIEWPAGEPARAM
(
"CARETTEMPLGROUP_SRFDA_GRIDVIEWPAGEPARAM"
,
"表格页面参数"
),
CARETTEMPLGROUP_SRFDA_EDITVIEWPAGEPARAM
(
"CARETTEMPLGROUP_SRFDA_EDITVIEWPAGEPARAM"
,
"编辑页面参数"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList100
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[第三方平台]
*/
@Getter
public
enum
OpenAccessType
{
ALIYUN
(
"aliyun"
,
"阿里云"
),
WECHAT
(
"wechat"
,
"微信开放平台"
),
QQ
(
"qq"
,
"QQ互联"
),
DINGTALK
(
"dingtalk"
,
"钉钉开放平台"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
OpenAccessType
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[性能分析指标]
*/
@Getter
public
enum
CodeList117
{
PODBACTION
(
"PODBACTION"
,
"数据库操作性能"
),
PODBQUERY
(
"PODBQUERY"
,
"数据库查询性能"
),
PODEDC
(
"PODEDC"
,
"实体处理逻辑性能"
),
POWORKFLOW
(
"POWORKFLOW"
,
"工作流性能"
),
POPAGE
(
"POPAGE"
,
"页面性能"
),
POPAGEBACKEND
(
"POPAGEBACKEND"
,
"页面性能(后台)"
),
POPAGESESSION
(
"POPAGESESSION"
,
"并发性能"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList117
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[数据库触发器事件]
*/
@Getter
public
enum
CodeList66
{
INSERT
(
"INSERT"
,
"Insert"
),
UPDATE
(
"UPDATE"
,
"Update"
),
DELETE
(
"DELETE"
,
"Delete"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList66
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[是否]
*/
@Getter
public
enum
YesNo
{
ITEM_1
(
"1"
,
"是"
),
ITEM_0
(
"0"
,
"否"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
YesNo
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[属性预定义值规则]
*/
@Getter
public
enum
CodeList13
{
INT
(
"INT"
,
"整数"
),
POSITIVEINT
(
"POSITIVEINT"
,
"正整数"
),
STRING
(
"STRING"
,
"字符串"
),
STRING_EMAIL
(
"STRING_EMAIL"
,
"电子邮件"
),
FLOAT
(
"FLOAT"
,
"浮点数"
),
FLOAT_PERCENT
(
"FLOAT_PERCENT"
,
"百分比数值(0~100)"
),
DATETIME
(
"DATETIME"
,
"日期时间"
),
DATETIME_GTNOW
(
"DATETIME_GTNOW"
,
"大于当天时间"
),
DATETIME_GTNOWNOHOUR
(
"DATETIME_GTNOWNOHOUR"
,
"大于当天日期"
),
DATETIME_GTNOW3DAY
(
"DATETIME_GTNOW3DAY"
,
"后3天"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList13
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[报表输出格式]
*/
@Getter
public
enum
CodeList54
{
PDF
(
"PDF"
,
"PDF"
),
EXCEL
(
"EXCEL"
,
"EXCEL"
),
HTML
(
"HTML"
,
"HTML"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList54
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[报表分类]
*/
@Getter
public
enum
CodeList12
{
REPORTFOLDER_1
(
"REPORTFOLDER_1"
,
"经营性报表"
),
REPORTFOLDER_2
(
"REPORTFOLDER_2"
,
"财务报表"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList12
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[用户数据行为]
*/
@Getter
public
enum
CodeList71
{
ITEM_1
(
"1"
,
"无建立"
),
ITEM_2
(
"2"
,
"无更新"
),
ITEM_4
(
"4"
,
"无删除"
),
ITEM_8
(
"8"
,
"无查看"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList71
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[数据通知监控行为(新建、更新、删除)]
*/
@Getter
public
enum
CodeList98
{
ITEM_1
(
"1"
,
"新建"
),
ITEM_2
(
"2"
,
"更新"
),
ITEM_4
(
"4"
,
"删除"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList98
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[开发帮助重要程度]
*/
@Getter
public
enum
CodeList31
{
LOW
(
"LOW"
,
"低"
),
NORMAIL
(
"NORMAIL"
,
"中"
),
HIGH
(
"HIGH"
,
"高"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList31
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[页面样式]
*/
@Getter
public
enum
CodeList22
{
ITEM_0
(
"0"
,
"跳转处理界面"
),
ITEM_1
(
"1"
,
"数据编辑界面"
),
ITEM_2
(
"2"
,
"数据表格界面"
),
ITEM_9
(
"9"
,
"数据树形界面"
),
ITEM_3
(
"3"
,
"数据选择界面"
),
ITEM_4
(
"4"
,
"工作流数据编辑界面"
),
ITEM_5
(
"5"
,
"工作流表格界面"
),
ITEM_6
(
"6"
,
"工作流管理表格界面"
),
ITEM_7
(
"7"
,
"导航界面"
),
ITEM_8
(
"8"
,
"信息展示界面"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList22
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[页面资源类型]
*/
@Getter
public
enum
CodeList17
{
NONE
(
"NONE"
,
"无资源"
),
DEDATA
(
"DEDATA"
,
"数据操作"
),
PAGE
(
"PAGE"
,
"页面对象"
),
CUSTOM
(
"CUSTOM"
,
"自定义"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList17
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[月(1~31)]
*/
@Getter
public
enum
CodeList47
{
ITEM_1
(
"1"
,
"1号"
),
ITEM_2
(
"2"
,
"2号"
),
ITEM_3
(
"3"
,
"3号"
),
ITEM_4
(
"4"
,
"4号"
),
ITEM_5
(
"5"
,
"5号"
),
ITEM_6
(
"6"
,
"6号"
),
ITEM_7
(
"7"
,
"7号"
),
ITEM_8
(
"8"
,
"8号"
),
ITEM_9
(
"9"
,
"9号"
),
ITEM_10
(
"10"
,
"10号"
),
ITEM_11
(
"11"
,
"11号"
),
ITEM_12
(
"12"
,
"12号"
),
ITEM_13
(
"13"
,
"13号"
),
ITEM_14
(
"14"
,
"14号"
),
ITEM_15
(
"15"
,
"15号"
),
ITEM_16
(
"16"
,
"16号"
),
ITEM_17
(
"17"
,
"17号"
),
ITEM_18
(
"18"
,
"18号"
),
ITEM_19
(
"19"
,
"19号"
),
ITEM_20
(
"20"
,
"20号"
),
ITEM_21
(
"21"
,
"21号"
),
ITEM_22
(
"22"
,
"22号"
),
ITEM_23
(
"23"
,
"23号"
),
ITEM_24
(
"24"
,
"24号"
),
ITEM_25
(
"25"
,
"25号"
),
ITEM_26
(
"26"
,
"26号"
),
ITEM_27
(
"27"
,
"27号"
),
ITEM_28
(
"28"
,
"28号"
),
ITEM_29
(
"29"
,
"29号"
),
ITEM_30
(
"30"
,
"30号"
),
ITEM_31
(
"31"
,
"31号"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList47
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[数据通知类型]
*/
@Getter
public
enum
CodeList61
{
TIME
(
"TIME"
,
"定时"
),
NORMAL
(
"NORMAL"
,
"值变更"
),
TIMEEX
(
"TIMEEX"
,
"定时+值判断"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList61
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体数据操作步骤]
*/
@Getter
public
enum
CodeList106
{
GETDEFAULT
(
"GETDEFAULT"
,
"获取默认值"
),
BEFORESAVE
(
"BEFORESAVE"
,
"保存之前"
),
AFTERSAVE
(
"AFTERSAVE"
,
"保存之后"
),
BEFOREREMOVE
(
"BEFOREREMOVE"
,
"删除之前"
),
AFTERREMOVE
(
"AFTERREMOVE"
,
"删除之后"
),
TESTSAVE
(
"TESTSAVE"
,
"测试保存"
),
CUSTOMCALL
(
"CUSTOMCALL"
,
"自定义操作"
),
INTERNALCALL
(
"INTERNALCALL"
,
"内部调用"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList106
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[数据同步方向]
*/
@Getter
public
enum
CodeList97
{
IN
(
"IN"
,
"输入"
),
OUT
(
"OUT"
,
"输出"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList97
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[表格列对齐]
*/
@Getter
public
enum
CodeList18
{
LEFT
(
"left"
,
"左对齐"
),
CENTER
(
"center"
,
"剧中"
),
RIGHT
(
"right"
,
"右对齐"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList18
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[数据通知取值规则]
*/
@Getter
public
enum
CodeList69
{
AFTER
(
"AFTER"
,
"变更后"
),
BEFORE
(
"BEFORE"
,
"变更前"
),
CHANGE
(
"CHANGE"
,
"值变更"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList69
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[开发数据版本控制状态]
*/
@Getter
public
enum
CodeList115
{
CHECKIN
(
"CHECKIN"
,
"签入"
),
CHECKOUT
(
"CHECKOUT"
,
"签出"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList115
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[页面参数值变量]
*/
@Getter
public
enum
CodeList63
{
PARAM1
(
"PARAM1"
,
"参数1(字符)"
),
PARAM2
(
"PARAM2"
,
"参数2(字符)"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList63
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[表格每页记录数]
*/
@Getter
public
enum
CodeList26
{
ITEM_10
(
"10"
,
"10行"
),
ITEM_20
(
"20"
,
"20行"
),
ITEM_30
(
"30"
,
"30行"
),
ITEM_40
(
"40"
,
"40行"
),
ITEM_50
(
"50"
,
"50行"
),
ITEM_60
(
"60"
,
"60行"
),
ITEM_70
(
"70"
,
"70行"
),
ITEM_80
(
"80"
,
"80行"
),
ITEM_90
(
"90"
,
"90行"
),
ITEM_100
(
"100"
,
"100行"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList26
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[界面功能类型]
*/
@Getter
public
enum
CodeList91
{
INHERIT
(
"INHERIT"
,
"继承模板"
),
DEFAULT
(
"DEFAULT"
,
"默认功能"
),
CUSTOM
(
"CUSTOM"
,
"自定义"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList91
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[日小时(0~23)]
*/
@Getter
public
enum
CodeList85
{
ITEM_00
(
"00"
,
"0点"
),
ITEM_01
(
"01"
,
"1点"
),
ITEM_02
(
"02"
,
"2点"
),
ITEM_03
(
"03"
,
"3点"
),
ITEM_04
(
"04"
,
"4点"
),
ITEM_05
(
"05"
,
"5点"
),
ITEM_06
(
"06"
,
"6点"
),
ITEM_07
(
"07"
,
"7点"
),
ITEM_08
(
"08"
,
"8点"
),
ITEM_09
(
"09"
,
"9点"
),
ITEM_10
(
"10"
,
"10点"
),
ITEM_11
(
"11"
,
"11点"
),
ITEM_12
(
"12"
,
"12点"
),
ITEM_13
(
"13"
,
"13点"
),
ITEM_14
(
"14"
,
"14点"
),
ITEM_15
(
"15"
,
"15点"
),
ITEM_16
(
"16"
,
"16点"
),
ITEM_17
(
"17"
,
"17点"
),
ITEM_18
(
"18"
,
"18点"
),
ITEM_19
(
"19"
,
"19点"
),
ITEM_20
(
"20"
,
"20点"
),
ITEM_21
(
"21"
,
"21点"
),
ITEM_22
(
"22"
,
"22点"
),
ITEM_23
(
"23"
,
"23点"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList85
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[月份(1~12)]
*/
@Getter
public
enum
CodeList82
{
ITEM_01
(
"01"
,
"1月"
),
ITEM_02
(
"02"
,
"2月"
),
ITEM_03
(
"03"
,
"3月"
),
ITEM_04
(
"04"
,
"4月"
),
ITEM_05
(
"05"
,
"5月"
),
ITEM_06
(
"06"
,
"6月"
),
ITEM_07
(
"07"
,
"7月"
),
ITEM_08
(
"08"
,
"8月"
),
ITEM_09
(
"09"
,
"9月"
),
ITEM_10
(
"10"
,
"10月"
),
ITEM_11
(
"11"
,
"11月"
),
ITEM_12
(
"12"
,
"12月"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList82
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[数据通知监控行为]
*/
@Getter
public
enum
CodeList72
{
ITEM_1
(
"1"
,
"新建"
),
ITEM_2
(
"2"
,
"更新"
),
ITEM_3
(
"3"
,
"新建或更新"
),
ITEM_4
(
"4"
,
"删除"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList72
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体规则处理_值处理函数]
*/
@Getter
public
enum
CodeList110
{
DATE_DIFF_D
(
"DATE_DIFF_D"
,
"距今天数(日期)"
),
DATE_DIFF_W
(
"DATE_DIFF_W"
,
"距今周数(日期)"
),
DATE_DIFF_M
(
"DATE_DIFF_M"
,
"距今月份数(日期)"
),
DATE_DIFF_Q
(
"DATE_DIFF_Q"
,
"距今季度数(日期)"
),
DATE_DIFF_Y
(
"DATE_DIFF_Y"
,
"距今年数(日期)"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList110
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体数据处理_变量名称]
*/
@Getter
public
enum
CodeList109
{
_DEFAULT_
(
"%DEFAULT%"
,
"默认变量"
),
_ENV_
(
"%ENV%"
,
"环境变量"
),
PARAM1
(
"PARAM1"
,
"变量1"
),
PARAM2
(
"PARAM2"
,
"变量2"
),
PARAM3
(
"PARAM3"
,
"变量3"
),
PARAM4
(
"PARAM4"
,
"变量4"
),
PARAM5
(
"PARAM5"
,
"变量5"
),
_LAST_
(
"%LAST%"
,
"历史值"
),
_GLOBAL1_
(
"%GLOBAL1%"
,
"全局变量1"
),
_GLOBAL2_
(
"%GLOBAL2%"
,
"全局变量2"
),
_GLOBAL3_
(
"%GLOBAL3%"
,
"全局变量3"
),
_GLOBAL4_
(
"%GLOBAL4%"
,
"全局变量4"
),
_GLOBAL5_
(
"%GLOBAL5%"
,
"全局变量5"
),
_BRINST_
(
"%BRINST%"
,
"全局规则引擎实例变量"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList109
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[字段排序方向]
*/
@Getter
public
enum
SortDir
{
ASC
(
"ASC"
,
"升序"
),
DESC
(
"DESC"
,
"降序"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
SortDir
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[日历参与者状态]
*/
@Getter
public
enum
CodeList15
{
UNDECIDED
(
"UNDECIDED"
,
"未确定"
),
ACCEPT
(
"ACCEPT"
,
"接受"
),
REJECT
(
"REJECT"
,
"拒绝"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList15
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[实体数据库操作]
*/
@Getter
public
enum
CodeList53
{
INSERT
(
"INSERT"
,
"插入"
),
UPDATE
(
"UPDATE"
,
"更新"
),
SELECT
(
"SELECT"
,
"查询"
),
DELETE
(
"DELETE"
,
"删除"
),
CUSTOM
(
"CUSTOM"
,
"自定义"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList53
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
/**
* 代码表[扩展表格单元格边框样式]
*/
@Getter
public
enum
CodeList76
{
LEFT
(
"LEFT"
,
"左边框"
),
TOP
(
"TOP"
,
"上边框"
),
RIGHT
(
"RIGHT"
,
"右边框"
),
BOTTOM
(
"BOTTOM"
,
"下边框"
);
private
String
value
;
private
String
text
;
private
String
valueSeparator
=
""
;
private
String
textSeparator
=
""
;
private
String
emptyText
=
""
;
CodeList76
(
String
value
,
String
text
)
{
this
.
value
=
value
;
this
.
text
=
text
;
}
}
}
src/main/java/cn/ibizlab/util/domain/DELogic.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
domain
;
import
lombok.Data
;
import
org.flowable.bpmn.model.Process
;
import
org.springframework.core.io.Resource
;
import
org.kie.api.runtime.KieContainer
;
import
java.io.File
;
import
java.io.Serializable
;
import
java.util.List
;
@Data
public
class
DELogic
implements
Serializable
{
String
id
;
String
name
;
Process
process
;
KieContainer
container
;
List
<
DELogic
>
refLogic
;
List
<
Resource
>
refRuleFiles
;
String
md5
;
int
logicMode
;
long
loadedTime
;
}
src/main/java/cn/ibizlab/util/domain/DTOBase.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
domain
;
import
com.alibaba.fastjson.annotation.JSONField
;
import
com.fasterxml.jackson.annotation.JsonAnyGetter
;
import
com.fasterxml.jackson.annotation.JsonAnySetter
;
import
com.fasterxml.jackson.annotation.JsonIgnore
;
import
lombok.Data
;
import
cn.ibizlab.util.helper.DEFieldCacheMap
;
import
org.springframework.cglib.beans.BeanMap
;
import
org.springframework.data.annotation.Transient
;
import
org.springframework.util.StringUtils
;
import
java.io.Serializable
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.Map
;
import
java.util.Set
;
@Data
public
class
DTOBase
implements
Serializable
{
@JsonIgnore
@JSONField
(
serialize
=
false
)
private
Set
<
String
>
focusNull
;
public
void
modify
(
String
field
,
Object
val
)
{
if
(
val
==
null
)
{
this
.
getFocusNull
(
true
).
add
(
field
.
toLowerCase
());
}
else
{
this
.
getFocusNull
(
true
).
remove
(
field
.
toLowerCase
());
}
}
public
Set
<
String
>
getFocusNull
()
{
if
(
focusNull
==
null
)
{
focusNull
=
new
HashSet
<>();
}
if
(
focusNull
.
size
()>
0
&&
extensionparams
.
containsKey
(
"dirtyflagenable"
))
{
Set
<
String
>
nocheck
=
new
HashSet
<>();
for
(
String
key:
focusNull
)
{
if
(!
extensionparams
.
containsKey
(
key
+
"dirtyflag"
))
{
nocheck
.
add
(
key
);
}
}
for
(
String
key:
nocheck
)
{
focusNull
.
remove
(
key
);
}
}
return
focusNull
;
}
private
Set
<
String
>
getFocusNull
(
boolean
newflag
)
{
if
(
focusNull
==
null
)
{
focusNull
=
new
HashSet
<>();
}
return
focusNull
;
}
@JsonIgnore
private
Map
<
String
,
Object
>
extensionparams
=
new
HashMap
<
String
,
Object
>();
public
Map
<
String
,
Object
>
getExtensionparams
()
{
return
extensionparams
;
}
public
void
setExtensionparams
(
Map
<
String
,
Object
>
extensionparams
)
{
this
.
extensionparams
=
extensionparams
;
}
@JsonAnyGetter
public
Map
<
String
,
Object
>
any
()
{
return
extensionparams
;
}
@JsonIgnore
@JSONField
(
serialize
=
false
)
@Transient
private
BeanMap
map
;
private
BeanMap
getMap
()
{
if
(
map
==
null
)
{
map
=
BeanMap
.
create
(
this
);
}
return
map
;
}
public
Object
get
(
String
field
)
{
String
fieldRealName
=
DEFieldCacheMap
.
getFieldRealName
(
this
.
getClass
(),
field
);
if
(!
StringUtils
.
isEmpty
(
fieldRealName
))
{
return
getMap
().
get
(
fieldRealName
);
}
else
{
return
this
.
extensionparams
.
get
(
field
.
toLowerCase
());
}
}
@JsonAnySetter
public
void
set
(
String
field
,
Object
value
)
{
field
=
field
.
toLowerCase
();
String
fieldRealName
=
DEFieldCacheMap
.
getFieldRealName
(
this
.
getClass
(),
field
);
if
(!
StringUtils
.
isEmpty
(
fieldRealName
))
{
if
(
value
==
null
)
{
getMap
().
put
(
fieldRealName
,
null
);
}
else
{
getMap
().
put
(
fieldRealName
,
DEFieldCacheMap
.
fieldValueOf
(
this
.
getClass
(),
fieldRealName
,
value
));
}
}
else
{
this
.
extensionparams
.
put
(
field
.
toLowerCase
(),
value
);
}
}
}
src/main/java/cn/ibizlab/util/domain/DTOClient.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
domain
;
public
class
DTOClient
extends
DTOBase
{
@Override
public
void
modify
(
String
field
,
Object
val
)
{
getExtensionparams
().
put
(
"dirtyflagenable"
,
true
);
if
(
val
==
null
){
this
.
getFocusNull
().
add
(
field
.
toLowerCase
());
getExtensionparams
().
put
(
field
.
toLowerCase
()+
"dirtyflag"
,
true
);
}
else
{
this
.
getFocusNull
().
remove
(
field
.
toLowerCase
());
getExtensionparams
().
remove
(
field
.
toLowerCase
()+
"dirtyflag"
);
}
}
}
src/main/java/cn/ibizlab/util/domain/EntityBase.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
domain
;
import
cn.ibizlab.util.helper.DEFieldCacheMap
;
import
com.alibaba.fastjson.annotation.JSONField
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.fasterxml.jackson.annotation.JsonAnyGetter
;
import
com.fasterxml.jackson.annotation.JsonAnySetter
;
import
com.fasterxml.jackson.annotation.JsonIgnore
;
import
org.springframework.cglib.beans.BeanMap
;
import
org.springframework.data.annotation.Transient
;
import
org.springframework.util.AlternativeJdkIdGenerator
;
import
org.springframework.util.ObjectUtils
;
import
java.io.Serializable
;
import
java.lang.reflect.Field
;
import
org.springframework.util.StringUtils
;
import
java.util.*
;
public
class
EntityBase
implements
Serializable
{
@JsonIgnore
@JSONField
(
serialize
=
false
)
@TableField
(
exist
=
false
)
@Transient
private
Set
<
String
>
focusNull
;
public
Set
<
String
>
getFocusNull
()
{
if
(
focusNull
==
null
)
{
focusNull
=
new
HashSet
<>();
}
return
focusNull
;
}
public
void
setFocusNull
(
Set
<
String
>
focusNull
)
{
this
.
focusNull
=
focusNull
;
}
public
void
modify
(
String
field
,
Object
val
)
{
}
public
Serializable
getDefaultKey
(
boolean
gen
)
{
String
Id
=(
new
AlternativeJdkIdGenerator
()).
generateId
().
toString
();
return
gen
?
Id
.
replace
(
"-"
,
""
):
Id
;
}
@JsonIgnore
@JSONField
(
serialize
=
false
)
@TableField
(
exist
=
false
)
@Transient
private
BeanMap
map
;
private
BeanMap
getMap
()
{
if
(
map
==
null
)
{
map
=
BeanMap
.
create
(
this
);
}
return
map
;
}
@JsonIgnore
@TableField
(
exist
=
false
)
@Transient
private
Map
<
String
,
Object
>
extensionparams
=
new
HashMap
<
String
,
Object
>();
public
Map
<
String
,
Object
>
getExtensionparams
()
{
return
extensionparams
;
}
public
void
setExtensionparams
(
Map
<
String
,
Object
>
extensionparams
)
{
this
.
extensionparams
=
extensionparams
;
}
public
Object
get
(
String
field
)
{
String
fieldRealName
=
DEFieldCacheMap
.
getFieldRealName
(
this
.
getClass
(),
field
);
if
(!
StringUtils
.
isEmpty
(
fieldRealName
))
{
return
getMap
().
get
(
fieldRealName
);
}
else
{
return
this
.
extensionparams
.
get
(
field
.
toLowerCase
());
}
}
@JsonAnyGetter
public
Map
<
String
,
Object
>
any
()
{
return
extensionparams
;
}
@JsonAnySetter
public
void
set
(
String
field
,
Object
value
)
{
field
=
field
.
toLowerCase
();
String
fieldRealName
=
DEFieldCacheMap
.
getFieldRealName
(
this
.
getClass
(),
field
);
if
(!
StringUtils
.
isEmpty
(
fieldRealName
))
{
if
(
value
==
null
)
{
getMap
().
put
(
fieldRealName
,
null
);
}
else
{
getMap
().
put
(
fieldRealName
,
DEFieldCacheMap
.
fieldValueOf
(
this
.
getClass
(),
fieldRealName
,
value
));
}
}
else
{
this
.
extensionparams
.
put
(
field
.
toLowerCase
(),
value
);
}
}
/**
* 复制当前对象数据到目标对象
* @param targetEntity 目标数据对象
* @param bIncEmpty 是否包括空值
* @param <T>
* @return
*/
public
<
T
>
T
copyTo
(
T
targetEntity
,
boolean
bIncEmpty
){
if
(
targetEntity
instanceof
EntityBase
){
EntityBase
target
=
(
EntityBase
)
targetEntity
;
Hashtable
<
String
,
Field
>
sourceFields
=
DEFieldCacheMap
.
getFieldMap
(
this
.
getClass
());
for
(
String
field
:
sourceFields
.
keySet
()){
Object
value
=
this
.
get
(
field
);
if
(
!
ObjectUtils
.
isEmpty
(
value
)
||
ObjectUtils
.
isEmpty
(
value
)
&&
getFocusNull
().
contains
(
field
)
&&
bIncEmpty
){
target
.
set
(
field
,
value
);
}
}
}
return
targetEntity
;
}
/**
* 重置当前数据对象属性值
* @param field
*/
public
void
reset
(
String
field
){
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/domain/EntityClient.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
domain
;
import
org.springframework.util.StringUtils
;
public
class
EntityClient
extends
EntityBase
{
@Override
public
void
modify
(
String
field
,
Object
val
)
{
getExtensionparams
().
put
(
"dirtyflagenable"
,
true
);
if
(
val
==
null
){
this
.
getFocusNull
().
add
(
field
.
toLowerCase
());
getExtensionparams
().
put
(
field
.
toLowerCase
()+
"dirtyflag"
,
true
);
}
else
{
this
.
getFocusNull
().
remove
(
field
.
toLowerCase
());
getExtensionparams
().
remove
(
field
.
toLowerCase
()+
"dirtyflag"
);
}
}
@Override
public
void
reset
(
String
field
)
{
if
(!
StringUtils
.
isEmpty
(
field
)){
String
resetField
=
field
.
toLowerCase
();
this
.
set
(
resetField
,
null
);
this
.
getFocusNull
().
remove
(
resetField
);
getExtensionparams
().
remove
(
resetField
+
"dirtyflag"
);
}
}
}
src/main/java/cn/ibizlab/util/domain/EntityMP.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
domain
;
import
com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper
;
import
org.springframework.util.StringUtils
;
public
class
EntityMP
extends
EntityBase
{
public
UpdateWrapper
getUpdateWrapper
(
boolean
clean
)
{
UpdateWrapper
wrapper
=
new
UpdateWrapper
();
for
(
String
nullField:
getFocusNull
())
{
wrapper
.
set
(
nullField
,
null
);
}
if
(
clean
)
{
getFocusNull
().
clear
();
}
return
wrapper
;
}
@Override
public
void
modify
(
String
field
,
Object
val
)
{
if
(
val
==
null
)
{
this
.
getFocusNull
().
add
(
field
.
toLowerCase
());
}
else
{
this
.
getFocusNull
().
remove
(
field
.
toLowerCase
());
}
}
@Override
public
void
reset
(
String
field
){
if
(!
StringUtils
.
isEmpty
(
field
)){
String
resetField
=
field
.
toLowerCase
();
this
.
set
(
resetField
,
null
);
getFocusNull
().
remove
(
resetField
);
}
}
}
src/main/java/cn/ibizlab/util/domain/EntityMongo.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
domain
;
public
class
EntityMongo
extends
EntityBase
{
}
src/main/java/cn/ibizlab/util/domain/FileItem.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
domain
;
import
com.fasterxml.jackson.annotation.JsonIgnoreProperties
;
import
com.fasterxml.jackson.annotation.JsonInclude
;
import
com.fasterxml.jackson.annotation.JsonInclude.Include
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
@Data
@JsonInclude
(
Include
.
NON_NULL
)
@JsonIgnoreProperties
(
ignoreUnknown
=
true
)
@AllArgsConstructor
public
class
FileItem
{
private
String
id
;
private
String
name
;
private
String
fileid
;
private
String
filename
;
private
long
size
;
private
String
ext
;
}
src/main/java/cn/ibizlab/util/domain/IBZConfig.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
domain
;
import
cn.ibizlab.util.helper.DataObject
;
import
com.alibaba.fastjson.annotation.JSONField
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
com.fasterxml.jackson.annotation.JsonIgnoreProperties
;
import
lombok.*
;
import
org.springframework.util.DigestUtils
;
import
org.springframework.util.StringUtils
;
import
java.sql.Timestamp
;
@TableName
(
value
=
"IBZCFG"
)
@JsonIgnoreProperties
(
ignoreUnknown
=
true
)
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public
class
IBZConfig
{
/**
* 配置标识
* 系统+配置类型+引用对象+用户标识联合主键
*/
@TableId
private
String
cfgId
;
/**
* 系统标识
*/
private
String
systemId
;
/**
* 配置类型
* 门户配置/表格自定义配置/自定义查询...消费方自定义
*/
private
String
cfgType
;
/**
* 引用对象
* 门户页标识/具体表格视图标识...消费方具体使用位置的标识
*/
private
String
targetType
;
/**
* 用户标识
* 默认当前登录者
*/
private
String
userId
;
/**
* 配置
* JSONObject
*/
private
String
cfg
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
,
locale
=
"zh"
,
timezone
=
"GMT+8"
)
@JSONField
(
format
=
"yyyy-MM-dd HH:mm:ss"
)
private
Timestamp
updateDate
;
public
String
getCfgId
()
{
if
(
StringUtils
.
isEmpty
(
cfgId
)&&
(!(
StringUtils
.
isEmpty
(
systemId
)))&&
(!(
StringUtils
.
isEmpty
(
cfgType
)))&&
(!(
StringUtils
.
isEmpty
(
targetType
)))&&
(!(
StringUtils
.
isEmpty
(
userId
))))
{
cfgId
=
DigestUtils
.
md5DigestAsHex
((
systemId
+
"||"
+
cfgType
+
"||"
+
targetType
+
"||"
+
userId
).
getBytes
());
}
return
cfgId
;
}
}
src/main/java/cn/ibizlab/util/domain/IBZDataAudit.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
domain
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.fasterxml.jackson.annotation.JsonIgnoreProperties
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.sql.Timestamp
;
import
java.util.Objects
;
/**
* 实体[DataAudit] 数据对象
*/
@TableName
(
value
=
"IBZDATAAUDIT"
)
@JsonIgnoreProperties
(
ignoreUnknown
=
true
)
@Data
public
class
IBZDataAudit
implements
Serializable
{
@TableId
(
value
=
"dataauditid"
,
type
=
IdType
.
UUID
)
//指定主键生成策略
private
String
dataauditid
;
private
String
dataauditname
;
private
String
oppersonid
;
private
String
oppersonname
;
private
String
audittype
;
private
Timestamp
optime
;
private
String
ipaddress
;
private
String
auditinfo
;
private
Object
auditobjectdata
;
private
String
auditobject
;
private
int
isdatachanged
;
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/domain/IBZUSER.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
domain
;
import
java.sql.Timestamp
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.fasterxml.jackson.annotation.JsonIgnoreProperties
;
import
lombok.Data
;
import
javax.validation.constraints.Size
;
import
java.io.Serializable
;
/**
* 实体[IBZUSER] 数据对象
*/
@TableName
(
value
=
"IBZUSER"
)
@JsonIgnoreProperties
(
ignoreUnknown
=
true
)
@Data
public
class
IBZUSER
implements
Serializable
{
@Size
(
min
=
0
,
max
=
100
,
message
=
"[用户标识]长度必须在[100]以内!"
)
@TableId
(
value
=
"userid"
,
type
=
IdType
.
INPUT
)
//指定主键生成策略
private
String
userid
;
@Size
(
min
=
0
,
max
=
200
,
message
=
"[用户全局名]长度必须在[200]以内!"
)
private
String
username
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[用户姓名]长度必须在[100]以内!"
)
private
String
personname
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[用户代码]长度必须在[100]以内!"
)
private
String
usercode
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[登录别名]长度必须在[100]以内!"
)
private
String
loginname
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[登录密码]长度必须在[100]以内!"
)
private
String
password
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[区属]长度必须在[100]以内!"
)
private
String
domains
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[主部门id]长度必须在[100]以内!"
)
private
String
mdeptid
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[主部门代码]长度必须在[100]以内!"
)
private
String
mdeptcode
;
@Size
(
min
=
0
,
max
=
200
,
message
=
"[主部门名称]长度必须在[200]以内!"
)
private
String
mdeptname
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[业务编码]长度必须在[100]以内!"
)
private
String
bcode
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[岗位id]长度必须在[100]以内!"
)
private
String
postid
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[岗位代码]长度必须在[100]以内!"
)
private
String
postcode
;
@Size
(
min
=
0
,
max
=
200
,
message
=
"[岗位名称]长度必须在[200]以内!"
)
private
String
postname
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[单位id]长度必须在[100]以内!"
)
private
String
orgid
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[单位代码]长度必须在[100]以内!"
)
private
String
orgcode
;
@Size
(
min
=
0
,
max
=
200
,
message
=
"[单位名称]长度必须在[200]以内!"
)
private
String
orgname
;
@Size
(
min
=
0
,
max
=
36
,
message
=
"[昵称]长度必须在[36]以内!"
)
private
String
nickname
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[邮箱]长度必须在[100]以内!"
)
private
String
email
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[通信账号]长度必须在[100]以内!"
)
private
String
avatar
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[联系电话]长度必须在[100]以内!"
)
private
String
phone
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[保留字段]长度必须在[100]以内!"
)
private
String
reserver
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[头像]长度必须在[100]以内!"
)
private
String
usericon
;
@Size
(
min
=
0
,
max
=
10
,
message
=
"[性别]长度必须在[10]以内!"
)
private
String
sex
;
private
Timestamp
birthday
;
@Size
(
min
=
0
,
max
=
36
,
message
=
"[证件号码]长度必须在[36]以内!"
)
private
String
certcode
;
@Size
(
min
=
0
,
max
=
200
,
message
=
"[地址]长度必须在[200]以内!"
)
private
String
addr
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[主题]长度必须在[100]以内!"
)
private
String
theme
;
@Size
(
min
=
0
,
max
=
100
,
message
=
"[语言]长度必须在[100]以内!"
)
private
String
lang
;
@Size
(
min
=
0
,
max
=
10
,
message
=
"[字号]长度必须在[10]以内!"
)
private
String
fontsize
;
@Size
(
min
=
0
,
max
=
500
,
message
=
"[备注]长度必须在[500]以内!"
)
private
String
memo
;
private
int
superuser
;
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/domain/LiquibaseProp.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
domain
;
import
lombok.Data
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.stereotype.Component
;
@Data
@Component
@ConfigurationProperties
(
prefix
=
"spring.datasource.dynamic.datasource.master"
)
public
class
LiquibaseProp
{
private
String
url
;
private
String
username
;
private
String
password
;
private
String
isSyncDBSchema
;
private
String
defaultSchema
;
private
String
conf
;
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/domain/MappingBase.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
domain
;
import
java.util.List
;
/**
* 实体转换器基类
* @param <D> domainDTO
* @param <E> domain
*/
public
interface
MappingBase
<
D
,
E
>
{
/**
* dto转domain
* @param dto
* @return
*/
E
toDomain
(
D
dto
);
/**
* domain转dto
* @param entity
* @return
*/
D
toDto
(
E
entity
);
/**
* dto集合转domain集合
* @param dtoList
* @return
*/
List
<
E
>
toDomain
(
List
<
D
>
dtoList
);
/**
* domain集合转dto集合
* @param entityList
* @return
*/
List
<
D
>
toDto
(
List
<
E
>
entityList
);
}
src/main/java/cn/ibizlab/util/domain/MsgBody.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
domain
;
import
com.alibaba.fastjson.annotation.JSONField
;
import
com.fasterxml.jackson.annotation.JsonProperty
;
import
lombok.Data
;
import
java.io.Serializable
;
/**
* 消息对象
*/
@Data
public
class
MsgBody
{
/**
* 接收用户
*/
@JSONField
(
name
=
"to_users"
)
@JsonProperty
(
"to_users"
)
private
String
toUsers
;
/**
* 标题
*/
@JSONField
(
name
=
"subject"
)
@JsonProperty
(
"subject"
)
private
String
subject
;
/**
* 内容
*/
@JSONField
(
name
=
"content"
)
@JsonProperty
(
"content"
)
private
String
content
;
/**
* 类型
*/
@JSONField
(
name
=
"msg_type"
)
@JsonProperty
(
"msg_type"
)
private
Integer
msgType
;
/**
* 模板标识
*/
@JSONField
(
name
=
"template_id"
)
@JsonProperty
(
"template_id"
)
private
String
templateId
;
/**
* 模板参数
*/
@JSONField
(
name
=
"template_params"
)
@JsonProperty
(
"template_params"
)
private
String
templateParams
;
/**
* 消息链接
*/
@JSONField
(
name
=
"msg_link"
)
@JsonProperty
(
"msg_link"
)
private
String
msgLink
;
/**
* 消息链接(pc)
*/
@JSONField
(
name
=
"msg_link_pc"
)
@JsonProperty
(
"msg_link_pc"
)
private
String
msgLinkPc
;
}
src/main/java/cn/ibizlab/util/domain/PayTrade.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
domain
;
import
com.alibaba.fastjson.annotation.JSONField
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.fasterxml.jackson.annotation.JsonProperty
;
import
lombok.Data
;
/**
* 实体[支付交易]
*/
@Data
public
class
PayTrade
{
/**
* 订单标题
*/
@TableField
(
value
=
"subject"
)
@JSONField
(
name
=
"subject"
)
@JsonProperty
(
"subject"
)
private
String
subject
;
/**
* 订单金额
*/
@JSONField
(
name
=
"total_amount"
)
@JsonProperty
(
"total_amount"
)
private
String
totalAmount
;
/**
* 订单号
*/
@JSONField
(
name
=
"out_trade_no"
)
@JsonProperty
(
"out_trade_no"
)
private
String
outTradeNo
;
/**
* rt开放平台配置标识(OpenAccessId或AppId)
*/
@JSONField
(
name
=
"access_id"
)
@JsonProperty
(
"access_id"
)
private
String
accessId
;
}
src/main/java/cn/ibizlab/util/enums/DEFieldDefaultValueType.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
enums
;
/**
* 实体属性默认值类型
*/
public
enum
DEFieldDefaultValueType
{
/**
* 用户全局对象
*/
SESSION
,
/**
* 系统全局对象
*/
APPLICATION
,
/**
* 唯一编码
*/
UNIQUEID
,
/**
* 网页请求
*/
CONTEXT
,
/**
* 数据对象属性
*/
PARAM
,
/**
* 当前时间
*/
CURTIME
,
/**
* 当前操作用户(编号)
*/
OPERATOR
,
/**
* 当前操作用户(名称)
*/
OPERATORNAME
,
/**
* 当前应用数据
*/
APPDATA
,
/**
* 默认值
*/
NONE
,
/**
* 用户自定义
*/
USER
,
/**
* 用户自定义2
*/
USER2
,
/**
* 用户自定义3
*/
USER3
,
/**
* 用户自定义4
*/
USER4
}
src/main/java/cn/ibizlab/util/enums/DEPredefinedFieldType.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
enums
;
/**
* 实体属性预定义类型
*/
public
enum
DEPredefinedFieldType
{
/**
* 创建人标识
*/
CREATEMAN
,
/**
* 创建人名称
*/
CREATEMANNAME
,
/**
* 更新人标识
*/
UPDATEMAN
,
/**
* 更新人名称
*/
UPDATEMANNAME
,
/**
* 创建时间
*/
CREATEDATE
,
/**
* 更新时间
*/
UPDATEDATE
,
/**
* 组织机构标识
*/
ORGID
,
/**
* 组织机构名称
*/
ORGNAME
,
/**
* 部门标识
*/
ORGSECTORID
,
/**
* 部门名称
*/
ORGSECTORNAME
,
/**
* 逻辑有效
*/
LOGICVALID
,
/**
* 排序
*/
ORDERVALUE
,
/**
* 不处理
*/
NONE
,
/**
* 动态父类型
*/
PARENTTYPE
,
/**
* 动态父标识
*/
PARENTID
,
/**
* 动态父名称
*/
PARENTNAME
}
src/main/java/cn/ibizlab/util/enums/DupCheck.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
enums
;
/**
* 属性重复值检查
*/
public
enum
DupCheck
{
/**
* 不检查
*/
NONE
,
/**
* 全部检查
*/
ALL
,
/**
* 非空检查
*/
NOTNULL
,
/**
* 指定范围检查
*/
RANGE
,
}
src/main/java/cn/ibizlab/util/enums/RedisChannelTopic.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
enums
;
import
org.springframework.data.redis.listener.ChannelTopic
;
/**
* redis频道
*/
public
enum
RedisChannelTopic
{
REDIS_CACHE_DELETE_TOPIC
(
"redis:cache:delete:topic1"
,
"删除redis缓存消息频道"
),
REDIS_CACHE_CLEAR_TOPIC
(
"redis:cache:clear:topic2"
,
"清空redis缓存消息频道"
),
REDIS_CACHE_DYNAMICMODEL_TOPIC
(
"redis:cache:dynamicmodel:topic3"
,
"动态模型频道"
);
String
channelTopic
;
String
label
;
RedisChannelTopic
(
String
channelTopic
,
String
label
)
{
this
.
channelTopic
=
channelTopic
;
this
.
label
=
label
;
}
public
ChannelTopic
getChannelTopic
()
{
return
new
ChannelTopic
(
channelTopic
);
}
public
static
RedisChannelTopic
getChannelTopicEnum
(
String
channelTopic
)
{
for
(
RedisChannelTopic
awardTypeEnum
:
RedisChannelTopic
.
values
())
{
if
(
awardTypeEnum
.
getChannelTopicStr
().
equals
(
channelTopic
))
{
return
awardTypeEnum
;
}
}
return
null
;
}
public
String
getChannelTopicStr
()
{
return
channelTopic
;
}
}
src/main/java/cn/ibizlab/util/errors/BadRequestAlertException.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
errors
;
import
org.zalando.problem.AbstractThrowableProblem
;
import
org.zalando.problem.Status
;
import
java.net.URI
;
import
java.util.HashMap
;
import
java.util.Map
;
public
class
BadRequestAlertException
extends
AbstractThrowableProblem
{
private
final
String
entityName
;
private
final
String
errorKey
;
public
BadRequestAlertException
(
String
defaultMessage
,
String
entityName
,
String
errorKey
)
{
this
(
ErrorConstants
.
DEFAULT_TYPE
,
defaultMessage
,
entityName
,
errorKey
);
}
public
BadRequestAlertException
(
URI
type
,
String
defaultMessage
,
String
entityName
,
String
errorKey
)
{
super
(
type
,
defaultMessage
,
Status
.
BAD_REQUEST
,
null
,
null
,
null
,
getAlertParameters
(
entityName
,
errorKey
));
this
.
entityName
=
entityName
;
this
.
errorKey
=
errorKey
;
}
public
String
getEntityName
()
{
return
entityName
;
}
public
String
getErrorKey
()
{
return
errorKey
;
}
private
static
Map
<
String
,
Object
>
getAlertParameters
(
String
entityName
,
String
errorKey
)
{
Map
<
String
,
Object
>
parameters
=
new
HashMap
<>();
parameters
.
put
(
"message"
,
"error."
+
errorKey
);
parameters
.
put
(
"params"
,
entityName
);
return
parameters
;
}
}
src/main/java/cn/ibizlab/util/errors/CustomParameterizedException.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
errors
;
import
org.zalando.problem.AbstractThrowableProblem
;
import
java.util.HashMap
;
import
java.util.Map
;
import
static
org
.
zalando
.
problem
.
Status
.
BAD_REQUEST
;
public
class
CustomParameterizedException
extends
AbstractThrowableProblem
{
private
static
final
long
serialVersionUID
=
1L
;
private
static
final
String
PARAM
=
"param"
;
public
CustomParameterizedException
(
String
message
,
String
...
params
)
{
this
(
message
,
toParamMap
(
params
));
}
public
CustomParameterizedException
(
String
message
,
Map
<
String
,
Object
>
paramMap
)
{
super
(
ErrorConstants
.
PARAMETERIZED_TYPE
,
"处理发生异常"
,
BAD_REQUEST
,
null
,
null
,
null
,
toProblemParameters
(
message
,
paramMap
));
}
public
static
Map
<
String
,
Object
>
toParamMap
(
String
...
params
)
{
Map
<
String
,
Object
>
paramMap
=
new
HashMap
<>();
if
(
params
!=
null
&&
params
.
length
>
0
)
{
for
(
int
i
=
0
;
i
<
params
.
length
;
i
++)
{
paramMap
.
put
(
PARAM
+
i
,
params
[
i
]);
}
}
return
paramMap
;
}
public
static
Map
<
String
,
Object
>
toProblemParameters
(
String
message
,
Map
<
String
,
Object
>
paramMap
)
{
Map
<
String
,
Object
>
parameters
=
new
HashMap
<>();
parameters
.
put
(
"message"
,
message
);
parameters
.
put
(
"params"
,
paramMap
);
return
parameters
;
}
}
src/main/java/cn/ibizlab/util/errors/ErrorConstants.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
errors
;
import
java.net.URI
;
public
final
class
ErrorConstants
{
public
static
final
String
ERR_CONCURRENCY_FAILURE
=
"处理请求发生错误"
;
public
static
final
String
ERR_VALIDATION
=
"数据校验发生错误"
;
public
static
final
String
PROBLEM_BASE_URL
=
""
;
public
static
final
URI
DEFAULT_TYPE
=
URI
.
create
(
PROBLEM_BASE_URL
+
"/problem-with-message"
);
public
static
final
URI
CONSTRAINT_VIOLATION_TYPE
=
URI
.
create
(
PROBLEM_BASE_URL
+
"/constraint-violation"
);
public
static
final
URI
PARAMETERIZED_TYPE
=
URI
.
create
(
PROBLEM_BASE_URL
+
"/parameterized"
);
private
ErrorConstants
()
{
}
}
src/main/java/cn/ibizlab/util/errors/ExceptionTranslator.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
errors
;
import
org.springframework.dao.*
;
import
org.springframework.http.HttpHeaders
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.validation.BindingResult
;
import
org.springframework.web.bind.MethodArgumentNotValidException
;
import
org.springframework.web.bind.annotation.ControllerAdvice
;
import
org.springframework.web.bind.annotation.ExceptionHandler
;
import
org.springframework.web.context.request.NativeWebRequest
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.web.multipart.MaxUploadSizeExceededException
;
import
org.zalando.problem.DefaultProblem
;
import
org.zalando.problem.Problem
;
import
org.zalando.problem.ProblemBuilder
;
import
org.zalando.problem.Status
;
import
org.zalando.problem.spring.web.advice.ProblemHandling
;
import
org.zalando.problem.spring.web.advice.validation.ConstraintViolationProblem
;
import
javax.annotation.Nonnull
;
import
javax.annotation.Nullable
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.List
;
import
java.util.stream.Collectors
;
@ControllerAdvice
public
class
ExceptionTranslator
implements
ProblemHandling
{
@Override
public
ResponseEntity
<
Problem
>
process
(
@Nullable
ResponseEntity
<
Problem
>
entity
,
NativeWebRequest
request
)
{
if
(
entity
==
null
||
entity
.
getBody
()
==
null
)
{
return
entity
;
}
Problem
problem
=
entity
.
getBody
();
if
(!(
problem
instanceof
ConstraintViolationProblem
||
problem
instanceof
DefaultProblem
))
{
return
entity
;
}
ProblemBuilder
builder
=
Problem
.
builder
()
.
withType
(
Problem
.
DEFAULT_TYPE
.
equals
(
problem
.
getType
())
?
ErrorConstants
.
DEFAULT_TYPE
:
problem
.
getType
())
.
withStatus
(
problem
.
getStatus
())
.
withTitle
(
problem
.
getTitle
())
.
with
(
"path"
,
request
.
getNativeRequest
(
HttpServletRequest
.
class
).
getRequestURI
());
if
(
problem
instanceof
ConstraintViolationProblem
)
{
builder
.
with
(
"violations"
,
((
ConstraintViolationProblem
)
problem
).
getViolations
())
.
with
(
"message"
,
ErrorConstants
.
ERR_VALIDATION
);
return
new
ResponseEntity
<>(
builder
.
build
(),
entity
.
getHeaders
(),
entity
.
getStatusCode
());
}
else
{
builder
.
withCause
(((
DefaultProblem
)
problem
).
getCause
())
.
withDetail
(
problem
.
getDetail
())
.
withInstance
(
problem
.
getInstance
());
problem
.
getParameters
().
forEach
(
builder:
:
with
);
if
(!
problem
.
getParameters
().
containsKey
(
"message"
)
&&
problem
.
getStatus
()
!=
null
)
{
builder
.
with
(
"message"
,
"error.http."
+
problem
.
getStatus
().
getStatusCode
());
}
return
new
ResponseEntity
<>(
builder
.
build
(),
entity
.
getHeaders
(),
entity
.
getStatusCode
());
}
}
@Override
public
ResponseEntity
<
Problem
>
handleMethodArgumentNotValid
(
MethodArgumentNotValidException
ex
,
@Nonnull
NativeWebRequest
request
)
{
BindingResult
result
=
ex
.
getBindingResult
();
List
<
FieldErrorVM
>
fieldErrors
=
result
.
getFieldErrors
().
stream
()
.
map
(
f
->
new
FieldErrorVM
(
f
.
getObjectName
(),
f
.
getField
(),
f
.
getDefaultMessage
()))
.
collect
(
Collectors
.
toList
());
Problem
problem
=
Problem
.
builder
()
.
withType
(
ErrorConstants
.
CONSTRAINT_VIOLATION_TYPE
)
.
withTitle
(
ErrorConstants
.
ERR_VALIDATION
)
.
withStatus
(
defaultConstraintViolationStatus
())
.
with
(
"message"
,
ErrorConstants
.
ERR_VALIDATION
)
.
with
(
"fieldErrors"
,
fieldErrors
)
.
build
();
return
create
(
ex
,
problem
,
request
);
}
@ExceptionHandler
(
BadRequestAlertException
.
class
)
public
ResponseEntity
<
Problem
>
handleBadRequestAlertException
(
BadRequestAlertException
ex
,
NativeWebRequest
request
)
{
return
create
(
ex
,
request
,
createFailureAlert
(
ex
.
getEntityName
(),
ex
.
getErrorKey
(),
ex
.
getMessage
()));
}
@ExceptionHandler
(
ConcurrencyFailureException
.
class
)
public
ResponseEntity
<
Problem
>
handleConcurrencyFailure
(
ConcurrencyFailureException
ex
,
NativeWebRequest
request
)
{
Problem
problem
=
Problem
.
builder
()
.
withStatus
(
Status
.
CONFLICT
)
.
with
(
"message"
,
ErrorConstants
.
ERR_CONCURRENCY_FAILURE
)
.
build
();
return
create
(
ex
,
problem
,
request
);
}
@ExceptionHandler
(
DataAccessException
.
class
)
public
ResponseEntity
<
Problem
>
handlerDataAccessFailure
(
DataAccessException
ex
,
NativeWebRequest
request
){
Problem
problem
=
Problem
.
builder
()
.
withStatus
(
Status
.
INTERNAL_SERVER_ERROR
)
.
with
(
"message"
,
ex
.
getMessage
())
.
build
();
return
create
(
ex
,
problem
,
request
,
createFailureAlert
(
ex
.
getClass
().
getSimpleName
(),
ex
.
getClass
().
getSimpleName
(),
ex
.
getMessage
()));
}
public
static
HttpHeaders
createFailureAlert
(
String
entityName
,
String
errorKey
,
String
defaultMessage
)
{
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
add
(
"X-ibz-error"
,
errorKey
);
headers
.
add
(
"X-ibz-params"
,
entityName
);
return
headers
;
}
/**
* 上传文件大小超出限制异常
*/
@Value
(
"${spring.servlet.multipart.max-file-size}"
)
private
String
maxFileSize
;
@ExceptionHandler
(
MaxUploadSizeExceededException
.
class
)
public
ResponseEntity
<
Problem
>
handlerMaxUploadFile
(
MaxUploadSizeExceededException
ex
,
NativeWebRequest
request
){
Problem
problem
=
Problem
.
builder
()
.
withStatus
(
Status
.
BAD_REQUEST
)
.
withDetail
(
"上传文件不能大于"
+
maxFileSize
)
.
with
(
"message"
,
"上传文件不能大于"
+
maxFileSize
)
.
with
(
"exmessage"
,
""
+
ex
.
getMessage
())
.
build
();
return
create
(
ex
,
problem
,
request
);
}
@ExceptionHandler
(
Exception
.
class
)
public
ResponseEntity
<
Problem
>
handlerTest
(
Exception
ex
,
NativeWebRequest
request
){
Problem
problem
=
Problem
.
builder
()
.
withStatus
(
Status
.
INTERNAL_SERVER_ERROR
)
.
withDetail
(
"内部服务器异常"
)
.
with
(
"message"
,
"内部服务器异常"
)
.
with
(
"exmessage"
,
""
+
ex
.
getMessage
())
.
build
();
return
create
(
ex
,
problem
,
request
);
}
}
src/main/java/cn/ibizlab/util/errors/FieldErrorVM.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
errors
;
import
java.io.Serializable
;
public
class
FieldErrorVM
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
private
final
String
objectName
;
private
final
String
field
;
private
final
String
message
;
public
FieldErrorVM
(
String
dto
,
String
field
,
String
message
)
{
this
.
objectName
=
dto
;
this
.
field
=
field
;
this
.
message
=
message
;
}
public
String
getObjectName
()
{
return
objectName
;
}
public
String
getField
()
{
return
field
;
}
public
String
getMessage
()
{
return
message
;
}
}
src/main/java/cn/ibizlab/util/errors/InternalServerErrorException.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
errors
;
import
org.zalando.problem.AbstractThrowableProblem
;
import
org.zalando.problem.Status
;
public
class
InternalServerErrorException
extends
AbstractThrowableProblem
{
public
InternalServerErrorException
(
String
message
)
{
super
(
ErrorConstants
.
DEFAULT_TYPE
,
message
,
Status
.
INTERNAL_SERVER_ERROR
);
}
}
src/main/java/cn/ibizlab/util/filter/ISearchContext.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
filter
;
public
interface
ISearchContext
{
}
src/main/java/cn/ibizlab/util/filter/QueryBuildContext.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
filter
;
import
com.alibaba.fastjson.annotation.JSONField
;
import
com.fasterxml.jackson.annotation.JsonIgnore
;
import
com.mongodb.QueryBuilder
;
import
lombok.*
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.util.ObjectUtils
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.regex.Pattern
;
@Slf4j
@Data
public
class
QueryBuildContext
extends
SearchContextBase
implements
ISearchContext
{
@JsonIgnore
@JSONField
(
serialize
=
false
)
private
QueryBuilder
selectCond
=
new
QueryBuilder
();
public
QueryBuilder
getSearchCond
(){
return
this
.
selectCond
;
}
/**
* 填充自定义查询条件
* @return
*/
public
QueryBuilder
getSelectCond
()
{
if
(!
ObjectUtils
.
isEmpty
(
filter
)){
QueryBuilder
queryBuilder
=
parseQueryFilter
(
filter
);
if
(!
ObjectUtils
.
isEmpty
(
queryBuilder
)){
selectCond
.
and
(
queryBuilder
.
get
());
}
}
return
selectCond
;
}
/**
* 解析自定义查询条件
* @param queryFilter
* @return
*/
private
QueryBuilder
parseQueryFilter
(
QueryFilter
queryFilter
){
if
(
ObjectUtils
.
isEmpty
(
queryFilter
.
get
$and
())
&&
ObjectUtils
.
isEmpty
(
queryFilter
.
get
$or
())
&&
ObjectUtils
.
isEmpty
(
queryFilter
.
any
()))
{
return
null
;
}
QueryBuilder
rsBuilder
=
QueryBuilder
.
start
();
QueryBuilder
fieldBuilder
=
parseFieldMap
(
queryFilter
.
any
());
QueryBuilder
orBuilder
=
parseOrQueryFilter
(
queryFilter
.
get
$or
());
QueryBuilder
andBuilder
=
parseAndQueryFilter
(
queryFilter
.
get
$and
());
if
(!
ObjectUtils
.
isEmpty
(
fieldBuilder
)){
rsBuilder
.
and
(
fieldBuilder
.
get
());
}
if
(!
ObjectUtils
.
isEmpty
(
orBuilder
)){
rsBuilder
.
and
(
orBuilder
.
get
());
}
if
(!
ObjectUtils
.
isEmpty
(
andBuilder
)){
rsBuilder
.
and
(
andBuilder
.
get
());
}
return
rsBuilder
;
}
/**
* 解析自定义条件[or]
* @param queryFilters
* @return
*/
private
QueryBuilder
parseOrQueryFilter
(
List
<
QueryFilter
>
queryFilters
)
{
QueryBuilder
orBuilder
=
new
QueryBuilder
();
if
(
queryFilters
==
null
||
queryFilters
.
size
()==
0
){
return
null
;
}
for
(
QueryFilter
queryFilter:
queryFilters
){
QueryBuilder
queryBuilder
=
parseQueryFilter
(
queryFilter
);
if
(!
ObjectUtils
.
isEmpty
(
queryBuilder
)){
orBuilder
.
or
(
queryBuilder
.
get
());
}
}
return
orBuilder
;
}
/**
* 解析自定义条件[and]
* @param queryFilters
* @return
*/
private
QueryBuilder
parseAndQueryFilter
(
List
<
QueryFilter
>
queryFilters
)
{
QueryBuilder
orBuilder
=
new
QueryBuilder
();
if
(
queryFilters
==
null
||
queryFilters
.
size
()==
0
){
return
null
;
}
for
(
QueryFilter
queryFilter:
queryFilters
){
QueryBuilder
queryBuilder
=
parseQueryFilter
(
queryFilter
);
if
(!
ObjectUtils
.
isEmpty
(
queryBuilder
)){
orBuilder
.
and
(
queryBuilder
.
get
());
}
}
return
orBuilder
;
}
/**
* 解析自定义条件[字段条件]
* @param fieldMap
* @return
*/
private
QueryBuilder
parseFieldMap
(
Map
<
String
,
QueryFilter
.
SegmentCond
>
fieldMap
)
{
if
(
fieldMap
.
size
()==
0
)
{
return
null
;
}
QueryBuilder
fieldBuilders
=
QueryBuilder
.
start
();
for
(
Map
.
Entry
<
String
,
QueryFilter
.
SegmentCond
>
entry:
fieldMap
.
entrySet
()){
getSegmentCondSql
(
entry
.
getKey
(),
entry
.
getValue
(),
fieldBuilders
);
}
return
fieldBuilders
;
}
/**
* 解析自定义条件[字段条件]
* @param fieldName
* @param segmentCond
* @param fieldBuilder
*/
private
void
getSegmentCondSql
(
String
fieldName
,
QueryFilter
.
SegmentCond
segmentCond
,
QueryBuilder
fieldBuilder
)
{
Map
<
String
,
Object
>
segmentCondMap
=
segmentCond
.
any
();
for
(
Map
.
Entry
<
String
,
Object
>
entry:
segmentCondMap
.
entrySet
()){
Object
value
=
entry
.
getValue
();
switch
(
entry
.
getKey
()){
case
"$eq"
:
fieldBuilder
.
and
(
QueryBuilder
.
start
().
and
(
fieldName
).
is
(
value
).
get
());
break
;
case
"$ne"
:
fieldBuilder
.
and
(
QueryBuilder
.
start
().
not
().
and
(
fieldName
).
is
(
value
).
get
());
break
;
case
"$gt"
:
fieldBuilder
.
and
(
QueryBuilder
.
start
().
and
(
fieldName
).
greaterThan
(
value
).
get
());
break
;
case
"$gte"
:
fieldBuilder
.
and
(
QueryBuilder
.
start
().
and
(
fieldName
).
greaterThanEquals
(
value
).
get
());
break
;
case
"$lt"
:
fieldBuilder
.
and
(
QueryBuilder
.
start
().
and
(
fieldName
).
lessThan
(
value
).
get
());
break
;
case
"$lte"
:
fieldBuilder
.
and
(
QueryBuilder
.
start
().
and
(
fieldName
).
lessThanEquals
(
value
).
get
());
break
;
case
"$null"
:
fieldBuilder
.
and
(
QueryBuilder
.
start
().
and
(
fieldName
).
exists
(
null
).
get
());
break
;
case
"$notNull"
:
fieldBuilder
.
and
(
QueryBuilder
.
start
().
and
(
fieldName
).
exists
(
true
).
and
(
fieldName
).
notEquals
(
""
).
and
(
fieldName
).
notEquals
(
null
).
get
());
break
;
case
"$in"
:
fieldBuilder
.
and
(
QueryBuilder
.
start
().
and
(
fieldName
).
in
(
value
).
get
());
break
;
case
"$notIn"
:
fieldBuilder
.
and
(
QueryBuilder
.
start
().
and
(
fieldName
).
not
().
in
(
value
).
get
());
break
;
case
"$like"
:
Pattern
likePattern
=
Pattern
.
compile
(
"^.*"
+
value
+
".*$"
,
Pattern
.
CASE_INSENSITIVE
);
fieldBuilder
.
and
(
QueryBuilder
.
start
().
and
(
fieldName
).
regex
(
likePattern
).
get
());
break
;
case
"$startsWith"
:
Pattern
startsWithPattern
=
Pattern
.
compile
(
value
+
".*$"
,
Pattern
.
CASE_INSENSITIVE
);
fieldBuilder
.
and
(
QueryBuilder
.
start
().
and
(
fieldName
).
regex
(
startsWithPattern
).
get
());
break
;
case
"$endsWith"
:
Pattern
endsWithPattern
=
Pattern
.
compile
(
"^.*"
+
value
+
"$"
,
Pattern
.
CASE_INSENSITIVE
);
fieldBuilder
.
and
(
QueryBuilder
.
start
().
and
(
fieldName
).
regex
(
endsWithPattern
).
get
());
break
;
case
"$exists"
:
break
;
case
"$notExists"
:
break
;
}
}
}
}
src/main/java/cn/ibizlab/util/filter/QueryFilter.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
filter
;
import
com.fasterxml.jackson.annotation.*
;
import
org.springframework.data.annotation.Transient
;
import
java.util.*
;
@JsonInclude
(
JsonInclude
.
Include
.
NON_EMPTY
)
public
class
QueryFilter
{
public
static
QueryFilter
createQuery
()
{
QueryFilter
queryFilter
=
new
QueryFilter
();
return
queryFilter
;
}
public
QueryFilter
eq
(
String
column
,
Object
value
)
{
return
op
(
column
,
SegmentCond
.
eq
(
value
));
}
public
QueryFilter
ne
(
String
column
,
Object
value
)
{
return
op
(
column
,
SegmentCond
.
ne
(
value
));
}
public
QueryFilter
gt
(
String
column
,
Object
value
)
{
return
op
(
column
,
SegmentCond
.
gt
(
value
));
}
public
QueryFilter
ge
(
String
column
,
Object
value
)
{
return
op
(
column
,
SegmentCond
.
ge
(
value
));
}
public
QueryFilter
lt
(
String
column
,
Object
value
)
{
return
op
(
column
,
SegmentCond
.
lt
(
value
));
}
public
QueryFilter
le
(
String
column
,
Object
value
)
{
return
op
(
column
,
SegmentCond
.
le
(
value
));
}
public
QueryFilter
isnull
(
String
column
)
{
return
op
(
column
,
SegmentCond
.
isnull
());
}
public
QueryFilter
isnotnull
(
String
column
)
{
return
op
(
column
,
SegmentCond
.
isnotnull
());
}
public
QueryFilter
in
(
String
column
,
Collection
value
)
{
return
op
(
column
,
SegmentCond
.
in
(
value
));
}
public
QueryFilter
notin
(
String
column
,
Collection
value
)
{
return
op
(
column
,
SegmentCond
.
notin
(
value
));
}
public
QueryFilter
like
(
String
column
,
String
value
)
{
return
op
(
column
,
SegmentCond
.
like
(
value
));
}
public
QueryFilter
startsWith
(
String
column
,
String
value
)
{
return
op
(
column
,
SegmentCond
.
startsWith
(
value
));
}
public
QueryFilter
endsWith
(
String
column
,
String
value
)
{
return
op
(
column
,
SegmentCond
.
endsWith
(
value
));
}
public
QueryFilter
between
(
String
column
,
Object
from
,
Object
to
)
{
return
op
(
column
,
SegmentCond
.
between
(
from
,
to
));
}
@JsonIgnore
@Transient
private
Map
<
String
,
SegmentCond
>
map
;
private
Map
<
String
,
SegmentCond
>
getMap
()
{
if
(
map
==
null
)
{
map
=
new
LinkedHashMap
<>();
}
return
map
;
}
@JsonAnyGetter
public
Map
<
String
,
SegmentCond
>
any
()
{
return
getMap
();
}
@JsonAnySetter
public
void
set
(
String
column
,
SegmentCond
value
)
{
getMap
().
put
(
column
,
value
);
}
@JsonProperty
(
index
=
999
)
private
List
<
QueryFilter
>
$or
;
public
List
<
QueryFilter
>
get$or
()
{
return
$or
;
}
public
void
set$or
(
List
<
QueryFilter
>
$or
)
{
this
.
$or
=
$or
;
}
public
QueryFilter
or
(
QueryFilter
...
ors
)
{
if
(
$or
==
null
)
{
$or
=
new
ArrayList
();
}
Collections
.
addAll
(
$or
,
ors
);
return
this
;
}
@JsonProperty
(
index
=
999
)
private
List
<
QueryFilter
>
$and
;
public
List
<
QueryFilter
>
get$and
()
{
return
$and
;
}
public
void
set$and
(
List
<
QueryFilter
>
$and
)
{
this
.
$and
=
$and
;
}
public
QueryFilter
and
(
QueryFilter
...
ands
)
{
if
(
$and
==
null
)
{
$and
=
new
ArrayList
();
}
Collections
.
addAll
(
$and
,
ands
);
return
this
;
}
@Override
public
String
toString
()
{
return
"QueryFilter{"
+
"map="
+
map
+
", $or="
+
$or
+
'}'
;
}
private
QueryFilter
op
(
String
column
,
SegmentCond
segmentCond
)
{
if
(
this
.
getMap
().
containsKey
(
column
))
{
((
SegmentCond
)
this
.
getMap
().
get
(
column
)).
getMap
().
putAll
(
segmentCond
.
getMap
());
}
else
{
this
.
getMap
().
put
(
column
,
segmentCond
);
}
return
this
;
}
public
static
class
SegmentCond
{
@JsonIgnore
@Transient
private
Map
<
String
,
Object
>
map
;
@Override
public
String
toString
()
{
return
"SegmentCond{"
+
"map="
+
map
+
'}'
;
}
private
Map
<
String
,
Object
>
getMap
()
{
if
(
map
==
null
)
{
map
=
new
LinkedHashMap
<>();
}
return
map
;
}
@JsonAnyGetter
public
Map
<
String
,
Object
>
any
()
{
return
getMap
();
}
@JsonAnySetter
public
void
set
(
String
column
,
Object
value
)
{
getMap
().
put
(
column
,
value
);
}
public
static
SegmentCond
eq
(
Object
value
)
{
return
op
(
Segment
.
EQ
,
value
);
}
public
static
SegmentCond
ne
(
Object
value
)
{
return
op
(
Segment
.
NE
,
value
);
}
public
static
SegmentCond
gt
(
Object
value
)
{
return
op
(
Segment
.
GT
,
value
);
}
public
static
SegmentCond
ge
(
Object
value
)
{
return
op
(
Segment
.
GE
,
value
);
}
public
static
SegmentCond
lt
(
Object
value
)
{
return
op
(
Segment
.
LT
,
value
);
}
public
static
SegmentCond
le
(
Object
value
)
{
return
op
(
Segment
.
LE
,
value
);
}
public
static
SegmentCond
isnull
()
{
return
op
(
Segment
.
IS_NULL
,
true
);
}
public
static
SegmentCond
isnotnull
()
{
return
op
(
Segment
.
IS_NOT_NULL
,
true
);
}
public
static
SegmentCond
in
(
Collection
value
)
{
return
op
(
Segment
.
IN
,
value
);
}
public
static
SegmentCond
notin
(
Collection
value
)
{
return
op
(
Segment
.
NOTIN
,
value
);
}
public
static
SegmentCond
like
(
String
value
)
{
return
op
(
Segment
.
LIKE
,
value
);
}
public
static
SegmentCond
startsWith
(
String
value
)
{
return
op
(
Segment
.
LEFTLIKE
,
value
);
}
public
static
SegmentCond
endsWith
(
String
value
)
{
return
op
(
Segment
.
RIGHTLIKE
,
value
);
}
public
static
SegmentCond
between
(
Object
from
,
Object
to
)
{
return
op
(
Segment
.
GE
,
from
).
op
(
Segment
.
LT
,
to
);
}
private
static
SegmentCond
op
(
Segment
segment
,
Object
value
)
{
SegmentCond
segmentCond
=
new
SegmentCond
();
segmentCond
.
getMap
().
put
(
segment
.
keyword
,
value
);
return
segmentCond
;
}
}
public
enum
Segment
{
AND
(
"$and"
),
OR
(
"$or"
),
EQ
(
"$eq"
),
NE
(
"$ne"
),
GT
(
"$gt"
),
GE
(
"$gte"
),
LT
(
"$lt"
),
LE
(
"$lte"
),
IS_NULL
(
"$null"
),
IS_NOT_NULL
(
"$notNull"
),
IN
(
"$in"
),
NOTIN
(
"$notIn"
),
LIKE
(
"$like"
),
LEFTLIKE
(
"$startsWith"
),
RIGHTLIKE
(
"$endsWith"
),
EXISTS
(
"$exists"
),
NOTEXISTS
(
"$notExists"
);
private
final
String
keyword
;
Segment
(
final
String
keyword
)
{
this
.
keyword
=
keyword
;
}
}
/*
SQL: (field1>1 and field2='3' and (field3 like "a" or (field4 is not null and field5 in ['11','12']) )
JAVA: QueryFilter filter=QueryFilter.createQuery()
.gt("field1",1)
.eq("field2",'3')
.or(QueryFilter.createQuery().like("field3","a")
,QueryFilter.createQuery().isnotnull("field4").in("field5",Arrays.asList("11","12")));
JSON: {
"$or":[
{
"field3":{"$like":"a"}
},
{
"field4":{ "$notNull":true},
"field5":{"$in":["11","12"]}
}],
"field1":{"$gt":1},
"field2":{"$eq":"3" }
}
*/
}
src/main/java/cn/ibizlab/util/filter/QueryWrapperContext.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
filter
;
import
cn.ibizlab.util.helper.DEFieldCacheMap
;
import
com.alibaba.fastjson.annotation.JSONField
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.fasterxml.jackson.annotation.JsonIgnore
;
import
lombok.*
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.data.domain.Sort
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.util.StringUtils
;
import
java.lang.reflect.ParameterizedType
;
import
java.util.*
;
import
java.util.function.Consumer
;
@Slf4j
@Data
public
class
QueryWrapperContext
<
T
>
extends
SearchContextBase
implements
ISearchContext
{
@JsonIgnore
@JSONField
(
serialize
=
false
)
private
QueryWrapper
<
T
>
selectCond
=
new
QueryWrapper
<
T
>();
/**
* 解析查询上下文中的参数,构建mybatis-plus分页对象
* @return
*/
@JsonIgnore
@JSONField
(
serialize
=
false
)
public
Page
getPages
(){
Page
page
;
List
<
String
>
asc_fieldList
=
new
ArrayList
<>();
List
<
String
>
desc_fieldList
=
new
ArrayList
<>();
int
currentPage
=
getPageable
().
getPageNumber
();
int
pageSize
=
getPageable
().
getPageSize
();
//构造mybatis-plus分页
if
(
StringUtils
.
isEmpty
(
currentPage
)
||
StringUtils
.
isEmpty
(
pageSize
))
{
page
=
new
Page
(
1
,
Short
.
MAX_VALUE
);
}
else
{
page
=
new
Page
(
currentPage
+
1
,
pageSize
);
}
//构造mybatis-plus排序
Sort
sort
=
getPageable
().
getSort
();
Iterator
<
Sort
.
Order
>
it_sort
=
sort
.
iterator
();
if
(
ObjectUtils
.
isEmpty
(
it_sort
))
{
return
page
;
}
ParameterizedType
parameterizedType
=
(
ParameterizedType
)
getClass
().
getGenericSuperclass
();
Class
<
T
>
type
=
(
Class
<
T
>)
parameterizedType
.
getActualTypeArguments
()[
0
];
while
(
it_sort
.
hasNext
())
{
Sort
.
Order
sort_order
=
it_sort
.
next
();
if
(
sort_order
.
getDirection
()==
Sort
.
Direction
.
ASC
){
asc_fieldList
.
add
(
DEFieldCacheMap
.
getFieldColumnName
(
type
,
sort_order
.
getProperty
()));
}
else
if
(
sort_order
.
getDirection
()==
Sort
.
Direction
.
DESC
){
desc_fieldList
.
add
(
DEFieldCacheMap
.
getFieldColumnName
(
type
,
sort_order
.
getProperty
()));
}
}
if
(
asc_fieldList
.
size
()>
0
){
page
.
setAscs
(
asc_fieldList
);
}
if
(
desc_fieldList
.
size
()>
0
){
page
.
setDescs
(
desc_fieldList
);
}
return
page
;
}
public
QueryWrapper
<
T
>
getSearchCond
(){
return
this
.
selectCond
;
}
/**
* 填充自定义查询条件
* @return
*/
public
QueryWrapper
<
T
>
getSelectCond
()
{
if
(!
ObjectUtils
.
isEmpty
(
filter
)){
Consumer
queryWrapper
=
parseQueryFilter
(
filter
);
if
(!
ObjectUtils
.
isEmpty
(
queryWrapper
)){
selectCond
.
and
(
queryWrapper
);
}
}
return
selectCond
;
}
/**
* 解析自定义查询条件
* @param queryFilter
* @return
*/
private
Consumer
<
QueryWrapper
<
T
>>
parseQueryFilter
(
QueryFilter
queryFilter
){
if
(
queryFilter
.
any
().
size
()==
0
&&
queryFilter
.
get
$or
()==
null
&&
queryFilter
.
get
$and
()==
null
)
{
return
null
;
}
Consumer
<
QueryWrapper
<
T
>>
consumer
=
queryWrapper
->
{
Consumer
fieldConsumer
=
parseFieldMap
(
queryFilter
.
any
());
Consumer
orConsumer
=
parseOrQueryFilter
(
queryFilter
.
get
$or
());
Consumer
andConsumer
=
parseAndQueryFilter
(
queryFilter
.
get
$and
());
if
(!
ObjectUtils
.
isEmpty
(
fieldConsumer
)){
queryWrapper
.
and
(
fieldConsumer
);
}
if
(!
ObjectUtils
.
isEmpty
(
orConsumer
)){
queryWrapper
.
and
(
orConsumer
);
}
if
(!
ObjectUtils
.
isEmpty
(
andConsumer
)){
queryWrapper
.
and
(
andConsumer
);
}
};
return
consumer
;
}
/**
* 解析自定义条件[or]
* @param queryFilters
* @return
*/
private
Consumer
<
QueryWrapper
<
T
>>
parseOrQueryFilter
(
List
<
QueryFilter
>
queryFilters
)
{
if
(
queryFilters
==
null
||
queryFilters
.
size
()==
0
)
return
null
;
Consumer
<
QueryWrapper
<
T
>>
consumer
=
queryWrapper
->
{
for
(
QueryFilter
queryFilter:
queryFilters
){
Consumer
tempQueryWrapper
=
parseQueryFilter
(
queryFilter
);
queryWrapper
.
or
(
tempQueryWrapper
);
}
};
return
consumer
;
}
/**
* 解析自定义条件[and]
* @param queryFilters
* @return
*/
private
Consumer
<
QueryWrapper
<
T
>>
parseAndQueryFilter
(
List
<
QueryFilter
>
queryFilters
)
{
if
(
queryFilters
==
null
||
queryFilters
.
size
()==
0
)
{
return
null
;
}
Consumer
<
QueryWrapper
<
T
>>
consumer
=
queryWrapper
->
{
for
(
QueryFilter
queryFilter:
queryFilters
){
Consumer
tempQueryWrapper
=
parseQueryFilter
(
queryFilter
);
queryWrapper
.
and
(
tempQueryWrapper
);
}
};
return
consumer
;
}
/**
* 解析自定义条件[字段条件]
* @param fieldMap
* @return
*/
private
Consumer
<
QueryWrapper
<
T
>>
parseFieldMap
(
Map
<
String
,
QueryFilter
.
SegmentCond
>
fieldMap
)
{
if
(
fieldMap
.
size
()==
0
)
{
return
null
;
}
Consumer
<
QueryWrapper
<
T
>>
consumer
=
queryWrapper
->
{
for
(
Map
.
Entry
<
String
,
QueryFilter
.
SegmentCond
>
field:
fieldMap
.
entrySet
()){
String
fieldName
=
field
.
getKey
();
QueryFilter
.
SegmentCond
segmentCond
=
field
.
getValue
();
Map
<
String
,
Object
>
segmentCondMap
=
segmentCond
.
any
();
for
(
Map
.
Entry
<
String
,
Object
>
fieldCond:
segmentCondMap
.
entrySet
()){
Object
value
=
fieldCond
.
getValue
();
switch
(
fieldCond
.
getKey
()){
case
"$eq"
:
queryWrapper
.
eq
(
fieldName
,
value
);
break
;
case
"$ne"
:
queryWrapper
.
ne
(
fieldName
,
value
);
break
;
case
"$gt"
:
queryWrapper
.
gt
(
fieldName
,
value
);
break
;
case
"$gte"
:
queryWrapper
.
ge
(
fieldName
,
value
);
break
;
case
"$lt"
:
queryWrapper
.
lt
(
fieldName
,
value
);
break
;
case
"$lte"
:
queryWrapper
.
le
(
fieldName
,
value
);
break
;
case
"$null"
:
queryWrapper
.
isNull
(
fieldName
);
break
;
case
"$notNull"
:
queryWrapper
.
isNotNull
(
fieldName
);
break
;
case
"$in"
:
queryWrapper
.
in
(
fieldName
,(
Collection
)
value
);
break
;
case
"$notIn"
:
queryWrapper
.
notIn
(
fieldName
,(
Collection
)
value
);
break
;
case
"$like"
:
queryWrapper
.
like
(
fieldName
,
value
);
break
;
case
"$startsWith"
:
queryWrapper
.
likeRight
(
fieldName
,
value
);
break
;
case
"$endsWith"
:
queryWrapper
.
likeLeft
(
fieldName
,
value
);
break
;
case
"$exists"
:
break
;
case
"$notExists"
:
break
;
}
}
}
};
return
consumer
;
}
}
src/main/java/cn/ibizlab/util/filter/SearchContextBase.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
filter
;
import
cn.ibizlab.util.security.AuthenticationUser
;
import
com.fasterxml.jackson.annotation.JsonAnyGetter
;
import
com.fasterxml.jackson.annotation.JsonAnySetter
;
import
com.fasterxml.jackson.annotation.JsonProperty
;
import
lombok.*
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.data.domain.PageRequest
;
import
com.fasterxml.jackson.annotation.JsonIgnore
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.domain.Sort
;
import
org.springframework.util.StringUtils
;
import
org.springframework.util.ObjectUtils
;
import
java.util.*
;
@Slf4j
@Data
public
class
SearchContextBase
implements
ISearchContext
{
/**
* 自定义查询条件
*/
@JsonProperty
(
"customcond"
)
public
String
customCond
;
/**
* 自定义查询参数
*/
@JsonProperty
(
"customparams"
)
public
String
customParams
;
/**
* 快速搜索
*/
@JsonProperty
(
"query"
)
public
String
query
;
/**
* 条件表达式
*/
@JsonProperty
(
"filter"
)
public
QueryFilter
filter
;
/**
* 数据查询
*/
public
List
dataQueryList
;
/**
* 当前页数
*/
public
int
page
=
0
;
/**
* 每页显示条数
*/
public
int
size
=
20
;
/**
* 排序
*/
public
String
sort
;
/**
* 排序对象
*/
@JsonIgnore
public
Sort
pageSort
;
/**
* 工作流步骤标识
*/
public
String
userTaskId
;
/**
* 工作流流程标识
*/
public
String
processDefinitionKey
;
/**
* 工作流标识
*/
@JsonProperty
(
"srfwf"
)
public
String
srfWF
;
/**
* 获取工作流步骤标识
*/
public
String
getUserTaskId
()
{
if
(
StringUtils
.
isEmpty
(
userTaskId
)){
Object
taskId
=
params
.
get
(
"usertaskid"
);
return
StringUtils
.
isEmpty
(
taskId
)?
null
:
String
.
valueOf
(
taskId
);
}
else
{
return
userTaskId
;
}
}
/**
* 获取工作流流程标识
* @return
*/
public
String
getProcessDefinitionKey
()
{
if
(
StringUtils
.
isEmpty
(
processDefinitionKey
)){
Object
processKey
=
params
.
get
(
"processdefinitionkey"
);
return
StringUtils
.
isEmpty
(
processKey
)?
null
:
String
.
valueOf
(
processKey
);
}
else
{
return
processDefinitionKey
;
}
}
/**
* 获取分页参数
* @return
*/
public
Pageable
getPageable
()
{
if
(
ObjectUtils
.
isEmpty
(
pageSort
))
{
return
PageRequest
.
of
(
page
,
size
);
}
else
{
return
PageRequest
.
of
(
page
,
size
,
pageSort
);
}
}
/**
* 设置排序值
* @param strSort
*/
public
void
setSort
(
String
strSort
)
{
this
.
sort
=
strSort
;
if
(!
StringUtils
.
isEmpty
(
strSort
)){
String
sortArr
[]=
strSort
.
split
(
","
);
String
sortField
=
sortArr
[
0
];
String
sortDirection
=
sortArr
[
1
];
if
(
sortDirection
.
equalsIgnoreCase
(
"asc"
)){
this
.
pageSort
=
Sort
.
by
(
Sort
.
Direction
.
ASC
,
sortField
);
}
else
if
(
sortDirection
.
equalsIgnoreCase
(
"desc"
)){
this
.
pageSort
=
Sort
.
by
(
Sort
.
Direction
.
DESC
,
sortField
);
}
}
}
/**
* 上下文参数
*/
Map
<
String
,
Object
>
params
=
new
HashMap
<
String
,
Object
>()
;
/**
* 获取数据上下文
* @return
*/
public
Map
<
String
,
Object
>
getDatacontext
()
{
return
params
;
}
/**
* 获取网页请求上下文
* @return
*/
public
Map
<
String
,
Object
>
getWebcontext
()
{
return
params
;
}
/**
* 获取用户上下文
* @return
*/
@JsonIgnore
public
Map
<
String
,
Object
>
getSessioncontext
()
{
return
AuthenticationUser
.
getAuthenticationUser
().
getSessionParams
();
}
@JsonAnyGetter
public
Map
<
String
,
Object
>
any
()
{
return
params
;
}
@JsonAnySetter
public
void
set
(
String
name
,
Object
value
)
{
params
.
put
(
name
,
value
);
}
}
src/main/java/cn/ibizlab/util/helper/CachedBeanCopier.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
helper
;
import
org.springframework.cglib.beans.BeanCopier
;
import
java.util.HashMap
;
import
java.util.Map
;
public
class
CachedBeanCopier
{
//创建过的BeanCopier实例放到缓存中,下次可以直接获取,提升性能
static
final
Map
<
String
,
BeanCopier
>
BEAN_COPIERS
=
new
HashMap
<
String
,
BeanCopier
>();
public
static
void
copy
(
Object
srcObj
,
Object
destObj
)
{
copy
(
srcObj
,
destObj
,
false
);
}
public
static
void
copy
(
Object
srcObj
,
Object
destObj
,
boolean
useConverter
)
{
if
(
srcObj
==
null
||
destObj
==
null
)
{
return
;
}
getCopier
(
srcObj
,
destObj
,
useConverter
).
copy
(
srcObj
,
destObj
,
null
);
}
public
synchronized
static
BeanCopier
getCopier
(
Object
srcObj
,
Object
destObj
,
boolean
useConverter
)
{
String
key
=
srcObj
.
getClass
().
getName
()+
destObj
.
getClass
().
getName
()+
useConverter
;
BeanCopier
copier
;
if
(!
BEAN_COPIERS
.
containsKey
(
key
))
{
copier
=
BeanCopier
.
create
(
srcObj
.
getClass
(),
destObj
.
getClass
(),
useConverter
);
BEAN_COPIERS
.
put
(
key
,
copier
);
}
else
{
copier
=
BEAN_COPIERS
.
get
(
key
);
}
return
copier
;
}
}
src/main/java/cn/ibizlab/util/helper/DEFieldCacheMap.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
helper
;
import
cn.ibizlab.util.annotation.Audit
;
import
cn.ibizlab.util.annotation.DEField
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.util.StringUtils
;
import
java.lang.reflect.Field
;
import
java.util.ArrayList
;
import
java.util.Hashtable
;
import
java.util.List
;
/**
* 实体对象属性缓存类
*/
public
class
DEFieldCacheMap
{
private
static
Hashtable
<
String
,
Hashtable
<
String
,
Field
>>
cacheMap
=
new
Hashtable
<>();
private
static
Hashtable
<
String
,
List
<
Field
>>
cacheList
=
new
Hashtable
<>();
private
static
Hashtable
<
String
,
Hashtable
<
String
,
String
>>
cacheKey
=
new
Hashtable
<>();
private
static
Hashtable
<
String
,
Hashtable
<
String
,
DEField
>>
cacheDEField
=
new
Hashtable
<>();
private
static
Hashtable
<
String
,
Hashtable
<
String
,
Audit
>>
cacheAuditField
=
new
Hashtable
<>();
private
static
Hashtable
<
String
,
String
>
cacheDEKeyField
=
new
Hashtable
<>();
private
static
Object
objLock1
=
new
Object
();
/**
* 将实体对象中的属性存入缓存中
* @param
* @return
*/
public
static
<
T
>
Hashtable
<
String
,
Field
>
getFieldMap
(
Class
<
T
>
clazz
)
{
String
className
=
clazz
.
getName
();
if
(
className
.
indexOf
(
"_$"
)>
0
)
{
className
=
className
.
substring
(
0
,
className
.
lastIndexOf
(
"_$"
));
}
if
(
cacheMap
.
containsKey
(
className
))
{
return
cacheMap
.
get
(
className
);
}
synchronized
(
objLock1
)
{
if
(
cacheMap
.
containsKey
(
className
))
{
return
cacheMap
.
get
(
className
);
}
Hashtable
<
String
,
Field
>
result
=
new
Hashtable
<
String
,
Field
>();
List
<
Field
>
list
=
new
ArrayList
<
Field
>();
Hashtable
<
String
,
String
>
keys
=
new
Hashtable
<
String
,
String
>();
Hashtable
<
String
,
DEField
>
defields
=
new
Hashtable
<>();
Hashtable
<
String
,
Audit
>
auditfields
=
new
Hashtable
<>();
Hashtable
<
String
,
String
>
dekeyfields
=
new
Hashtable
<>();
Field
[]
fields
=
clazz
.
getDeclaredFields
();
for
(
Field
field:
fields
){
result
.
put
(
field
.
getName
(),
field
);
list
.
add
(
field
);
keys
.
put
(
field
.
getName
().
toLowerCase
(),
field
.
getName
());
DEField
deField
=
field
.
getAnnotation
(
DEField
.
class
);
Audit
auditField
=
field
.
getAnnotation
(
Audit
.
class
);
if
(!
ObjectUtils
.
isEmpty
(
deField
))
{
defields
.
put
(
field
.
getName
(),
deField
);
if
(
deField
.
isKeyField
())
{
cacheDEKeyField
.
put
(
className
,
field
.
getName
());
}
}
if
(!
ObjectUtils
.
isEmpty
(
auditField
))
{
auditfields
.
put
(
field
.
getName
(),
auditField
);
}
}
cacheMap
.
put
(
className
,
result
);
cacheList
.
put
(
className
,
list
);
cacheKey
.
put
(
className
,
keys
);
cacheDEField
.
put
(
className
,
defields
);
cacheAuditField
.
put
(
className
,
auditfields
);
return
result
;
}
}
public
static
Hashtable
<
String
,
Field
>
getFieldMap
(
String
className
)
{
if
(
className
.
indexOf
(
"_$"
)>
0
)
{
className
=
className
.
substring
(
0
,
className
.
lastIndexOf
(
"_$"
));
}
if
(
cacheMap
.
containsKey
(
className
))
{
return
cacheMap
.
get
(
className
);
}
Class
clazz
=
null
;
try
{
clazz
=
Class
.
forName
(
className
);
return
getFieldMap
(
clazz
);
}
catch
(
Exception
ex
)
{
cacheMap
.
put
(
className
,
new
Hashtable
<
String
,
Field
>());
return
cacheMap
.
get
(
className
);
}
}
/**
* 从缓存中查询实体对象属性集合
* @param
* @return
*/
public
static
<
T
>
Hashtable
<
String
,
DEField
>
getDEFields
(
Class
<
T
>
clazz
)
{
String
className
=
clazz
.
getName
();
if
(
className
.
indexOf
(
"_$"
)>
0
)
{
className
=
className
.
substring
(
0
,
className
.
lastIndexOf
(
"_$"
));
}
if
(
cacheDEField
.
containsKey
(
className
))
{
return
cacheDEField
.
get
(
className
);
}
else
{
DEFieldCacheMap
.
getFieldMap
(
className
);
return
cacheDEField
.
get
(
className
);
}
}
/**
* 从缓存中查询审计属性集合
* @param
* @return
*/
public
static
<
T
>
Hashtable
<
String
,
Audit
>
getAuditFields
(
Class
<
T
>
clazz
)
{
String
className
=
clazz
.
getName
();
if
(
className
.
indexOf
(
"_$"
)>
0
)
{
className
=
className
.
substring
(
0
,
className
.
lastIndexOf
(
"_$"
));
}
if
(
cacheAuditField
.
containsKey
(
className
))
{
return
cacheAuditField
.
get
(
className
);
}
else
{
DEFieldCacheMap
.
getFieldMap
(
className
);
return
cacheAuditField
.
get
(
className
);
}
}
/**
* 从缓存中查询实体对象主键
* @param
* @return
*/
public
static
<
T
>
String
getDEKeyField
(
Class
<
T
>
clazz
)
{
String
className
=
clazz
.
getName
();
if
(
className
.
indexOf
(
"_$"
)>
0
)
{
className
=
className
.
substring
(
0
,
className
.
lastIndexOf
(
"_$"
));
}
if
(
cacheDEKeyField
.
containsKey
(
className
))
{
return
cacheDEKeyField
.
get
(
className
);
}
else
{
DEFieldCacheMap
.
getFieldMap
(
className
);
return
cacheDEKeyField
.
get
(
className
);
}
}
/**
* 从缓存中查询实体对象属性列表
* @param
* @return
*/
public
static
<
T
>
List
<
Field
>
getFields
(
Class
<
T
>
clazz
)
{
String
className
=
clazz
.
getName
();
if
(
className
.
indexOf
(
"_$"
)>
0
)
{
className
=
className
.
substring
(
0
,
className
.
lastIndexOf
(
"_$"
));
}
if
(
cacheList
.
containsKey
(
className
))
{
return
cacheList
.
get
(
className
);
}
else
{
DEFieldCacheMap
.
getFieldMap
(
className
);
return
cacheList
.
get
(
className
);
}
}
public
static
List
<
Field
>
getFields
(
String
className
)
{
if
(
className
.
indexOf
(
"_$"
)>
0
)
{
className
=
className
.
substring
(
0
,
className
.
lastIndexOf
(
"_$"
));
}
if
(
cacheList
.
containsKey
(
className
))
{
return
cacheList
.
get
(
className
);
}
else
{
DEFieldCacheMap
.
getFieldMap
(
className
);
return
cacheList
.
get
(
className
);
}
}
/**
* 从缓存中查询实体对象属性列表
* @param
* @return
*/
public
static
<
T
>
Hashtable
<
String
,
String
>
getFieldKeys
(
Class
<
T
>
clazz
)
{
String
className
=
clazz
.
getName
();
if
(
className
.
indexOf
(
"_$"
)>
0
)
{
className
=
className
.
substring
(
0
,
className
.
lastIndexOf
(
"_$"
));
}
if
(
cacheKey
.
containsKey
(
className
))
{
return
cacheKey
.
get
(
className
);
}
else
{
DEFieldCacheMap
.
getFieldMap
(
className
);
return
cacheKey
.
get
(
className
);
}
}
public
static
<
T
>
String
getFieldRealName
(
Class
<
T
>
clazz
,
String
fieldname
)
{
fieldname
=
fieldname
.
toLowerCase
();
Hashtable
<
String
,
String
>
keys
=
DEFieldCacheMap
.
getFieldKeys
(
clazz
);
if
(
keys
.
containsKey
(
fieldname
))
{
return
keys
.
get
(
fieldname
);
}
else
if
(
keys
.
containsKey
(
fieldname
.
replace
(
"_"
,
""
)))
{
return
keys
.
get
(
fieldname
.
replace
(
"_"
,
""
));
}
else
{
return
""
;
}
}
public
static
<
T
>
Field
getField
(
Class
<
T
>
clazz
,
String
fieldname
)
{
String
fieldRealName
=
DEFieldCacheMap
.
getFieldRealName
(
clazz
,
fieldname
);
if
(!
StringUtils
.
isEmpty
(
fieldRealName
))
{
return
DEFieldCacheMap
.
getFieldMap
(
clazz
).
get
(
fieldRealName
);
}
else
{
return
null
;
}
}
public
static
<
T
>
String
getFieldColumnName
(
Class
<
T
>
clazz
,
String
fieldname
)
{
Field
field
=
DEFieldCacheMap
.
getField
(
clazz
,
fieldname
);
if
(
field
!=
null
)
{
DEField
deField
=
field
.
getAnnotation
(
DEField
.
class
);
if
(
deField
!=
null
&&
!
StringUtils
.
isEmpty
(
deField
.
name
()))
return
deField
.
name
();
}
return
fieldname
;
}
public
static
<
T
>
Object
fieldValueOf
(
Class
<
T
>
clazz
,
String
fieldname
,
Object
fieldValue
)
{
if
(
fieldValue
==
null
)
return
null
;
Object
resultValue
=
fieldValue
;
Field
field
=
DEFieldCacheMap
.
getField
(
clazz
,
fieldname
);
if
(
field
!=
null
)
{
Class
<?>
type
=
field
.
getType
();
resultValue
=
DataObject
.
objectValueOf
(
type
,
fieldValue
);
}
return
resultValue
;
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/helper/DataObject.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
helper
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
org.springframework.util.StringUtils
;
import
java.math.BigDecimal
;
import
java.math.BigInteger
;
import
java.sql.Timestamp
;
import
java.text.DateFormat
;
import
java.text.ParseException
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
public
class
DataObject
{
final
static
public
DateFormat
datetimeFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
final
static
public
DateFormat
datetimeFormat2
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm"
);
final
static
public
DateFormat
dayFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
);
final
static
public
String
getStringValue
(
Object
objValue
,
String
strDefault
)
{
if
(
objValue
==
null
)
{
return
strDefault
;
}
if
(
objValue
instanceof
String
)
{
return
(
String
)
objValue
;
}
if
(
objValue
instanceof
java
.
sql
.
Timestamp
||
objValue
instanceof
java
.
sql
.
Date
||
objValue
instanceof
java
.
util
.
Date
)
{
String
rt
=
datetimeFormat
.
format
(
objValue
);
if
(
rt
.
endsWith
(
" 00:00:00"
))
{
rt
=
dayFormat
.
format
(
objValue
);
}
else
if
(
rt
.
endsWith
(
":00"
))
{
rt
=
datetimeFormat2
.
format
(
objValue
);
}
return
rt
;
}
return
objValue
.
toString
();
}
public
static
<
T
>
Object
objectValueOf
(
Class
<
T
>
type
,
Object
fieldValue
)
{
if
(
fieldValue
==
null
)
{
return
null
;
}
Object
resultValue
=
fieldValue
;
String
targetType
=
type
.
getSimpleName
();
if
(
targetType
.
equalsIgnoreCase
(
fieldValue
.
getClass
().
getSimpleName
())){
return
resultValue
;
}
if
(
targetType
.
equals
(
"Boolean"
)){
resultValue
=
getBooleanValue
(
fieldValue
,
false
);
}
else
if
(
targetType
.
equals
(
"Character"
)){
resultValue
=
getCharacterValue
(
fieldValue
,
null
);
}
else
if
(
targetType
.
equals
(
"Byte"
)){
resultValue
=
getBinaryValue
(
fieldValue
,
null
);
}
else
if
(
targetType
.
equals
(
"Short"
)){
resultValue
=
Short
.
valueOf
(
fieldValue
.
toString
());
}
else
if
(
targetType
.
equals
(
"Integer"
)){
resultValue
=
getIntegerValue
(
fieldValue
,
null
);
}
else
if
(
targetType
.
equals
(
"Long"
)){
resultValue
=
getLongValue
(
fieldValue
,
null
);
}
else
if
(
targetType
.
equals
(
"Float"
)){
resultValue
=
getFloatValue
(
fieldValue
,
null
);
}
else
if
(
targetType
.
equals
(
"Double"
)){
resultValue
=
getDoubleValue
(
fieldValue
,
null
);
}
else
if
(
targetType
.
equals
(
"BigDecimal"
)){
resultValue
=
getBigDecimalValue
(
fieldValue
,
null
);
}
else
if
(
targetType
.
equals
(
"BigInteger"
)){
resultValue
=
getBigIntegerValue
(
fieldValue
,
null
);
}
else
if
(
targetType
.
equals
(
"Timestamp"
)){
resultValue
=
getTimestampValue
(
fieldValue
,
null
);
}
else
if
(
targetType
.
equals
(
"String"
))
{
resultValue
=
getStringValue
(
fieldValue
,
null
);
}
if
(
resultValue
==
null
)
{
return
null
;
}
return
resultValue
;
}
public
static
<
T
>
T
valueOf
(
Class
<
T
>
type
,
Object
fieldValue
)
{
return
(
T
)
objectValueOf
(
type
,
fieldValue
);
}
final
static
public
JSONObject
getJSONObjectValue
(
Object
objValue
,
JSONObject
jDefault
)
{
if
(
objValue
==
null
)
{
return
jDefault
;
}
if
(
objValue
instanceof
JSONObject
)
{
return
(
JSONObject
)
objValue
;
}
String
strValue
=
objValue
.
toString
();
try
{
return
JSONObject
.
parseObject
(
strValue
);
}
catch
(
Exception
ex
)
{
return
jDefault
;
}
}
final
static
public
JSONArray
getJSONArrayValue
(
Object
objValue
,
JSONArray
jDefault
)
{
if
(
objValue
==
null
)
{
return
jDefault
;
}
if
(
objValue
instanceof
JSONArray
)
{
return
(
JSONArray
)
objValue
;
}
String
strValue
=
objValue
.
toString
();
try
{
return
JSONArray
.
parseArray
(
strValue
);
}
catch
(
Exception
ex
)
{
return
jDefault
;
}
}
final
static
public
List
<
String
>
getListValue
(
Object
objValue
)
{
if
(
objValue
==
null
)
{
return
new
ArrayList
<
String
>();
}
JSONArray
arr
=(
getJSONArrayValue
(
objValue
,
null
));
if
(
arr
!=
null
)
{
List
<
String
>
chk1
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
arr
.
size
();
i
++)
{
if
(
arr
.
get
(
i
)
instanceof
String
)
{
chk1
.
add
(
arr
.
getString
(
i
));
}
}
return
chk1
;
}
else
{
return
new
ArrayList
<
String
>();
}
}
final
static
public
Boolean
getBooleanValue
(
Object
objValue
,
Boolean
bDefault
)
{
if
(
objValue
==
null
)
{
return
bDefault
;
}
if
(
objValue
instanceof
Boolean
)
{
return
(
Boolean
)
objValue
;
}
return
objValue
.
toString
().
equalsIgnoreCase
(
"true"
)||
objValue
.
toString
().
equals
(
"1"
)||
objValue
.
toString
().
equals
(
"y"
);
}
final
static
public
char
[]
getCharacterValue
(
Object
objValue
,
char
[]
cDefault
)
{
if
(
objValue
==
null
)
{
return
cDefault
;
}
return
objValue
.
toString
().
toCharArray
();
}
final
static
public
Double
getDoubleValue
(
Object
objValue
,
Double
dDefault
)
{
if
(
objValue
==
null
)
{
return
dDefault
;
}
if
(
objValue
instanceof
Double
)
{
return
(
Double
)
objValue
;
}
String
strValue
=
objValue
.
toString
();
if
(
StringUtils
.
isEmpty
(
strValue
))
{
return
null
;
}
strValue
=
strValue
.
replace
(
","
,
""
);
return
Double
.
parseDouble
(
strValue
);
}
final
static
public
int
getIntegerValue
(
Object
objValue
,
Integer
nDefault
)
{
if
(
objValue
==
null
)
{
return
nDefault
;
}
if
(
objValue
instanceof
Integer
)
{
return
(
Integer
)
objValue
;
}
if
(
objValue
instanceof
Double
)
{
return
((
Double
)
objValue
).
intValue
();
}
if
(
objValue
instanceof
BigDecimal
)
{
return
((
BigDecimal
)
objValue
).
intValue
();
}
String
strValue
=
objValue
.
toString
();
if
(
StringUtils
.
isEmpty
(
strValue
))
{
return
nDefault
;
}
strValue
=
strValue
.
replace
(
","
,
""
);
return
Integer
.
parseInt
(
strValue
);
}
final
static
public
Float
getFloatValue
(
Object
objValue
,
Float
fDefault
)
{
if
(
objValue
==
null
)
{
return
fDefault
;
}
try
{
if
(
objValue
instanceof
Float
)
{
return
(
Float
)
objValue
;
}
String
strValue
=
objValue
.
toString
();
if
(
StringUtils
.
isEmpty
(
strValue
))
{
return
fDefault
;
}
strValue
=
strValue
.
replace
(
","
,
""
);
return
Float
.
parseFloat
(
strValue
);
}
catch
(
Exception
ex
)
{
return
fDefault
;
}
}
final
static
public
BigDecimal
getBigDecimalValue
(
Object
objValue
,
BigDecimal
fDefault
)
{
if
(
objValue
==
null
)
{
return
fDefault
;
}
try
{
if
(
objValue
instanceof
BigDecimal
){
return
(
BigDecimal
)(
objValue
);
}
if
(
objValue
instanceof
Double
){
return
BigDecimal
.
valueOf
((
Double
)
objValue
);
}
if
(
objValue
instanceof
Long
){
return
BigDecimal
.
valueOf
((
Long
)
objValue
);
}
String
strValue
=
objValue
.
toString
();
if
(
StringUtils
.
isEmpty
(
strValue
))
{
return
fDefault
;
}
strValue
=
strValue
.
replace
(
","
,
""
);
return
BigDecimal
.
valueOf
(
Double
.
parseDouble
(
strValue
));
}
catch
(
Exception
ex
)
{
return
fDefault
;
}
}
final
static
public
BigInteger
getBigIntegerValue
(
Object
objValue
,
BigInteger
fDefault
)
{
if
(
objValue
==
null
)
{
return
fDefault
;
}
try
{
if
(
objValue
instanceof
BigInteger
){
return
(
BigInteger
)(
objValue
);
}
else
{
Long
l
=
getLongValue
(
objValue
,
null
);
if
(
l
!=
null
)
{
return
BigInteger
.
valueOf
(
l
);
}
}
}
catch
(
Exception
ex
)
{
}
return
fDefault
;
}
final
static
public
Long
getLongValue
(
Object
objValue
,
Long
nDefault
)
{
if
(
objValue
==
null
)
{
return
nDefault
;
}
try
{
if
(
objValue
instanceof
Long
)
return
(
Long
)
objValue
;
if
(
objValue
instanceof
Integer
)
{
return
((
Integer
)
objValue
).
longValue
();
}
if
(
objValue
instanceof
Double
)
{
return
((
Double
)
objValue
).
longValue
();
}
if
(
objValue
instanceof
BigDecimal
)
{
return
((
BigDecimal
)
objValue
).
longValue
();
}
String
strValue
=
objValue
.
toString
();
if
(
StringUtils
.
isEmpty
(
strValue
))
{
return
nDefault
;
}
strValue
=
strValue
.
replace
(
","
,
""
);
return
Long
.
parseLong
(
strValue
);
}
catch
(
Exception
ex
)
{
return
nDefault
;
}
}
final
static
public
byte
[]
getBinaryValue
(
Object
objValue
,
byte
[]
def
)
{
if
(
objValue
==
null
)
{
return
def
;
}
if
(
objValue
instanceof
byte
[]){
return
(
byte
[])
objValue
;
}
if
(
objValue
instanceof
String
){
return
Base64
.
getDecoder
().
decode
((
String
)
objValue
);
}
return
def
;
}
/**
* 转换对象值到时间值
*
* @param objValue
* @return
* @
*/
final
static
public
java
.
sql
.
Timestamp
getTimestampValue
(
Object
objValue
,
java
.
sql
.
Timestamp
tDefault
)
{
if
(
objValue
==
null
)
{
return
tDefault
;
}
if
(
objValue
instanceof
java
.
sql
.
Timestamp
)
{
java
.
sql
.
Timestamp
ti
=
(
java
.
sql
.
Timestamp
)
objValue
;
return
ti
;
}
if
(
objValue
instanceof
java
.
sql
.
Date
)
{
java
.
sql
.
Date
date
=
(
java
.
sql
.
Date
)
objValue
;
return
new
java
.
sql
.
Timestamp
(
date
.
getTime
());
}
if
(
objValue
instanceof
java
.
util
.
Date
)
{
java
.
util
.
Date
date
=
(
java
.
util
.
Date
)
objValue
;
return
new
java
.
sql
.
Timestamp
(
date
.
getTime
());
}
if
(
objValue
instanceof
String
)
{
String
strValue
=
(
String
)
objValue
;
strValue
=
strValue
.
trim
();
if
(
StringUtils
.
isEmpty
(
strValue
))
{
return
null
;
}
try
{
java
.
util
.
Date
date
=
parse
((
String
)
objValue
);
return
new
java
.
sql
.
Timestamp
(
date
.
getTime
());
}
catch
(
Exception
ex
)
{
return
tDefault
;
}
}
if
(
objValue
instanceof
Long
)
{
Long
lValue
=
(
Long
)
objValue
;
return
new
java
.
sql
.
Timestamp
(
lValue
);
}
if
(
objValue
instanceof
Integer
)
{
int
lValue
=
(
int
)
objValue
;
return
new
java
.
sql
.
Timestamp
(
lValue
);
}
return
tDefault
;
}
public
static
Object
testDateTime
(
String
strInput
)
throws
Exception
{
return
testDateTime
(
strInput
,
null
);
}
/**
* 转换文本值到日期时间
*
* @param strInput
* @param timeZone
* @return
* @
*/
public
static
Object
testDateTime
(
String
strInput
,
TimeZone
timeZone
)
throws
Exception
{
if
(
StringUtils
.
isEmpty
(
strInput
))
{
return
null
;
}
Date
dtDate
=
parse
(
strInput
,
timeZone
);
java
.
sql
.
Timestamp
retDate
=
new
java
.
sql
.
Timestamp
(
dtDate
.
getTime
());
return
retDate
;
}
/**
* 转换字符串到时间对象
*
* @param strTimeString
* @return
* @throws ParseException
* @
*/
public
static
Date
parse
(
String
strTimeString
)
throws
ParseException
,
Exception
{
return
parse
(
strTimeString
,
null
);
}
/**
* 分析时间串
*
* @param strTimeString MM/dd/yy yy-MM-dd HH:mm:ss 格式
* @param timeZone
* @return
* @throws ParseException
* @
*/
public
static
Date
parse
(
String
strTimeString
,
TimeZone
timeZone
)
throws
ParseException
,
Exception
{
strTimeString
=
strTimeString
.
trim
();
if
(
StringUtils
.
isEmpty
(
strTimeString
)){
throw
new
Exception
(
"unknown date(time) string"
);
}
if
(
strTimeString
.
indexOf
(
"Z"
)!=-
1
){
//有时区
String
[]
parts
=
strTimeString
.
split
(
"[Z]"
);
if
(
parts
.
length
>=
1
){
strTimeString
=
parts
[
0
];
}
if
(
parts
.
length
>=
2
){
if
(
timeZone
==
null
){
if
(!
StringUtils
.
isEmpty
(
parts
[
1
])){
timeZone
=
TimeZone
.
getTimeZone
(
parts
[
1
]);
}
}
}
}
// 判断是长数据还是短数据
String
strPart
[]
=
null
;
if
(
strTimeString
.
indexOf
(
"T"
)!=-
1
){
strPart
=
strTimeString
.
split
(
"[T]"
);
}
else
{
strPart
=
strTimeString
.
split
(
" "
);
}
if
(
strPart
.
length
==
2
)
{
// 两个部分
String
strDate
=
""
;
String
strTime
=
""
;
if
(
strPart
[
0
].
indexOf
(
":"
)
!=
-
1
)
{
strTime
=
strPart
[
0
];
strDate
=
strPart
[
1
];
}
else
{
strTime
=
strPart
[
1
];
strDate
=
strPart
[
0
];
}
strDate
=
strDate
.
trim
();
strTime
=
strTime
.
trim
();
strDate
=
getFormatDateString
(
strDate
);
strTime
=
getFormatTimeString
(
strTime
);
DateFormat
dtFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
if
(
timeZone
!=
null
)
{
dtFormat
.
setTimeZone
(
timeZone
);
}
return
dtFormat
.
parse
(
strDate
+
" "
+
strTime
);
}
else
{
// 一个部分
if
(
strTimeString
.
indexOf
(
":"
)
!=
-
1
)
{
// 时间
strTimeString
=
getFormatTimeString
(
strTimeString
);
DateFormat
dtFormat
=
new
SimpleDateFormat
(
"HH:mm:ss"
);
if
(
timeZone
!=
null
)
{
dtFormat
.
setTimeZone
(
timeZone
);
}
return
dtFormat
.
parse
(
strTimeString
);
}
else
{
// 作为日期处理
strTimeString
=
getFormatDateString
(
strTimeString
);
DateFormat
dtFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
);
if
(
timeZone
!=
null
)
{
dtFormat
.
setTimeZone
(
timeZone
);
}
return
dtFormat
.
parse
(
strTimeString
);
}
}
}
/**
* 获取时间格式化串
*
* @param strOrigin
* @return
*/
private
static
String
getFormatTimeString
(
String
strOrigin
)
{
int
nDotPos
=
strOrigin
.
indexOf
(
"."
);
if
(
nDotPos
!=
-
1
)
{
strOrigin
=
strOrigin
.
substring
(
0
,
nDotPos
);
}
Object
Time
[]
=
new
Object
[
3
];
Time
[
0
]
=
0
;
Time
[
1
]
=
0
;
Time
[
2
]
=
0
;
String
timepart
[]
=
strOrigin
.
split
(
":"
);
int
nTimePartLength
=
timepart
.
length
;
if
(
nTimePartLength
>
3
)
{
nTimePartLength
=
3
;
}
for
(
int
i
=
0
;
i
<
nTimePartLength
;
i
++)
{
Time
[
i
]
=
Integer
.
parseInt
(
timepart
[
i
]);
}
return
String
.
format
(
"%1$02d:%2$02d:%3$02d"
,
Time
);
}
/**
* 获取时日期格式化串
*
* @param strOrigin
* @return
* @
*/
private
static
String
getFormatDateString
(
String
strOrigin
)
throws
Exception
{
return
getFormatDateString
(
strOrigin
,
true
);
}
/**
* 获取时日期格式化串
*
* @param strOrigin
* @param bAdv
* @return
* @
*/
private
static
String
getFormatDateString
(
String
strOrigin
,
boolean
bAdv
)
throws
Exception
{
Object
Date
[]
=
new
Object
[
3
];
Date
[
0
]
=
1970
;
Date
[
1
]
=
1
;
Date
[
2
]
=
1
;
if
(
strOrigin
.
indexOf
(
"-"
)
!=
-
1
)
{
String
datePart
[]
=
strOrigin
.
split
(
"-"
);
if
(
datePart
.
length
>=
1
)
{
Date
[
0
]
=
Integer
.
parseInt
(
datePart
[
0
]);
}
if
(
datePart
.
length
>=
2
)
{
Date
[
1
]
=
Integer
.
parseInt
(
datePart
[
1
]);
}
if
(
datePart
.
length
>=
3
)
{
Date
[
2
]
=
Integer
.
parseInt
(
datePart
[
2
]);
}
}
else
if
(
strOrigin
.
indexOf
(
"/"
)
!=
-
1
)
{
String
datePart
[]
=
strOrigin
.
split
(
"/"
);
if
(
datePart
.
length
>=
1
)
{
Date
[
1
]
=
Integer
.
parseInt
(
datePart
[
0
]);
}
if
(
datePart
.
length
>=
2
)
{
Date
[
2
]
=
Integer
.
parseInt
(
datePart
[
1
]);
}
if
(
datePart
.
length
>=
3
)
{
Date
[
0
]
=
Integer
.
parseInt
(
datePart
[
2
]);
}
}
else
{
if
(
bAdv
)
{
strOrigin
=
strOrigin
.
replace
(
"."
,
"-"
);
strOrigin
=
strOrigin
.
replace
(
"日"
,
""
);
strOrigin
=
strOrigin
.
replace
(
"天"
,
""
);
strOrigin
=
strOrigin
.
replace
(
"年"
,
"-"
);
strOrigin
=
strOrigin
.
replace
(
"月"
,
"-"
);
return
getFormatDateString
(
strOrigin
,
false
);
}
else
throw
new
Exception
(
"无法识别的时间字符串,"
+
strOrigin
);
}
return
String
.
format
(
"%1$04d-%2$02d-%3$02d"
,
Date
);
}
public
static
Timestamp
getBeginDate
()
{
Calendar
cl
=
Calendar
.
getInstance
(
TimeZone
.
getTimeZone
(
"GMT+8"
));
cl
.
set
(
1900
,
1
,
1
);
return
new
Timestamp
(
cl
.
getTime
().
getTime
());
}
public
static
Timestamp
getEndDate
()
{
Calendar
cl
=
Calendar
.
getInstance
(
TimeZone
.
getTimeZone
(
"GMT+8"
));
cl
.
set
(
2100
,
12
,
31
,
23
,
59
,
59
);
return
new
Timestamp
(
cl
.
getTime
().
getTime
());
}
public
static
Timestamp
getNow
()
{
Calendar
cl
=
Calendar
.
getInstance
(
TimeZone
.
getTimeZone
(
"GMT+8"
));
return
new
Timestamp
(
cl
.
getTime
().
getTime
());
}
}
src/main/java/cn/ibizlab/util/helper/Globs.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
helper
;
import
java.util.regex.PatternSyntaxException
;
/**
* Copy from class sun.nio.fs.Globs
*/
public
class
Globs
{
private
Globs
()
{
}
private
static
final
String
regexMetaChars
=
".^$+{[]|()"
;
private
static
final
String
globMetaChars
=
"\\*?[{"
;
private
static
boolean
isRegexMeta
(
char
c
)
{
return
regexMetaChars
.
indexOf
(
c
)
!=
-
1
;
}
private
static
boolean
isGlobMeta
(
char
c
)
{
return
globMetaChars
.
indexOf
(
c
)
!=
-
1
;
}
private
static
char
EOL
=
0
;
//TBD
private
static
char
next
(
String
glob
,
int
i
)
{
if
(
i
<
glob
.
length
())
{
return
glob
.
charAt
(
i
);
}
return
EOL
;
}
/**
* Creates a regex pattern from the given glob expression.
*
* @throws PatternSyntaxException
*/
private
static
String
toRegexPattern
(
String
globPattern
,
boolean
isDos
)
{
boolean
inGroup
=
false
;
StringBuilder
regex
=
new
StringBuilder
(
"^"
);
int
i
=
0
;
while
(
i
<
globPattern
.
length
())
{
char
c
=
globPattern
.
charAt
(
i
++);
switch
(
c
)
{
case
'\\'
:
// escape special characters
if
(
i
==
globPattern
.
length
())
{
throw
new
PatternSyntaxException
(
"No character to escape"
,
globPattern
,
i
-
1
);
}
char
next
=
globPattern
.
charAt
(
i
++);
if
(
isGlobMeta
(
next
)
||
isRegexMeta
(
next
))
{
regex
.
append
(
'\\'
);
}
regex
.
append
(
next
);
break
;
case
'/'
:
if
(
isDos
)
{
regex
.
append
(
"\\\\"
);
}
else
{
regex
.
append
(
c
);
}
break
;
case
'['
:
// don't match name separator in class
if
(
isDos
)
{
regex
.
append
(
"[[^\\\\]&&["
);
}
else
{
regex
.
append
(
"[[^/]&&["
);
}
if
(
next
(
globPattern
,
i
)
==
'^'
)
{
// escape the regex negation char if it appears
regex
.
append
(
"\\^"
);
i
++;
}
else
{
// negation
if
(
next
(
globPattern
,
i
)
==
'!'
)
{
regex
.
append
(
'^'
);
i
++;
}
// hyphen allowed at start
if
(
next
(
globPattern
,
i
)
==
'-'
)
{
regex
.
append
(
'-'
);
i
++;
}
}
boolean
hasRangeStart
=
false
;
char
last
=
0
;
while
(
i
<
globPattern
.
length
())
{
c
=
globPattern
.
charAt
(
i
++);
if
(
c
==
']'
)
{
break
;
}
if
(
c
==
'/'
||
(
isDos
&&
c
==
'\\'
))
{
throw
new
PatternSyntaxException
(
"Explicit 'name separator' in class"
,
globPattern
,
i
-
1
);
}
// TBD: how to specify ']' in a class?
if
(
c
==
'\\'
||
c
==
'['
||
c
==
'&'
&&
next
(
globPattern
,
i
)
==
'&'
)
{
// escape '\', '[' or "&&" for regex class
regex
.
append
(
'\\'
);
}
regex
.
append
(
c
);
if
(
c
==
'-'
)
{
if
(!
hasRangeStart
)
{
throw
new
PatternSyntaxException
(
"Invalid range"
,
globPattern
,
i
-
1
);
}
if
((
c
=
next
(
globPattern
,
i
++))
==
EOL
||
c
==
']'
)
{
break
;
}
if
(
c
<
last
)
{
throw
new
PatternSyntaxException
(
"Invalid range"
,
globPattern
,
i
-
3
);
}
regex
.
append
(
c
);
hasRangeStart
=
false
;
}
else
{
hasRangeStart
=
true
;
last
=
c
;
}
}
if
(
c
!=
']'
)
{
throw
new
PatternSyntaxException
(
"Missing ']"
,
globPattern
,
i
-
1
);
}
regex
.
append
(
"]]"
);
break
;
case
'{'
:
if
(
inGroup
)
{
throw
new
PatternSyntaxException
(
"Cannot nest groups"
,
globPattern
,
i
-
1
);
}
regex
.
append
(
"(?:(?:"
);
inGroup
=
true
;
break
;
case
'}'
:
if
(
inGroup
)
{
regex
.
append
(
"))"
);
inGroup
=
false
;
}
else
{
regex
.
append
(
'}'
);
}
break
;
case
','
:
if
(
inGroup
)
{
regex
.
append
(
")|(?:"
);
}
else
{
regex
.
append
(
','
);
}
break
;
case
'*'
:
if
(
next
(
globPattern
,
i
)
==
'*'
)
{
// crosses directory boundaries
regex
.
append
(
".*"
);
i
++;
}
else
{
// within directory boundary
if
(
isDos
)
{
regex
.
append
(
"[^\\\\]*"
);
}
else
{
regex
.
append
(
"[^/]*"
);
}
}
break
;
case
'?'
:
if
(
isDos
)
{
regex
.
append
(
"[^\\\\]"
);
}
else
{
regex
.
append
(
"[^/]"
);
}
break
;
default
:
if
(
isRegexMeta
(
c
))
{
regex
.
append
(
'\\'
);
}
regex
.
append
(
c
);
}
}
if
(
inGroup
)
{
throw
new
PatternSyntaxException
(
"Missing '}"
,
globPattern
,
i
-
1
);
}
return
regex
.
append
(
'$'
).
toString
();
}
public
static
String
toUnixRegexPattern
(
String
globPattern
)
{
return
toRegexPattern
(
globPattern
,
false
);
}
public
static
String
toWindowsRegexPattern
(
String
globPattern
)
{
return
toRegexPattern
(
globPattern
,
true
);
}
}
src/main/java/cn/ibizlab/util/helper/JSR310DateConverters.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
helper
;
import
org.springframework.core.convert.converter.Converter
;
import
java.sql.Timestamp
;
import
java.time.*
;
import
java.util.Date
;
/**
* <p>JSR310DateConverters class.</p>
*/
public
final
class
JSR310DateConverters
{
private
JSR310DateConverters
()
{
}
public
static
class
TimestampToDateConverter
implements
Converter
<
Timestamp
,
Date
>
{
public
static
final
TimestampToDateConverter
INSTANCE
=
new
TimestampToDateConverter
();
private
TimestampToDateConverter
()
{
}
@Override
public
Date
convert
(
Timestamp
source
)
{
return
source
==
null
?
null
:
new
Date
(
source
.
getTime
());
}
}
public
static
class
DateToTimestampConverter
implements
Converter
<
Date
,
Timestamp
>
{
public
static
final
DateToTimestampConverter
INSTANCE
=
new
DateToTimestampConverter
();
private
DateToTimestampConverter
()
{
}
@Override
public
Timestamp
convert
(
Date
source
)
{
return
source
==
null
?
null
:
new
Timestamp
(
source
.
getTime
());
}
}
public
static
class
LocalDateToDateConverter
implements
Converter
<
LocalDate
,
Date
>
{
public
static
final
LocalDateToDateConverter
INSTANCE
=
new
LocalDateToDateConverter
();
private
LocalDateToDateConverter
()
{
}
@Override
public
Date
convert
(
LocalDate
source
)
{
return
source
==
null
?
null
:
Date
.
from
(
source
.
atStartOfDay
(
ZoneId
.
systemDefault
()).
toInstant
());
}
}
public
static
class
DateToLocalDateConverter
implements
Converter
<
Date
,
LocalDate
>
{
public
static
final
DateToLocalDateConverter
INSTANCE
=
new
DateToLocalDateConverter
();
private
DateToLocalDateConverter
()
{
}
@Override
public
LocalDate
convert
(
Date
source
)
{
return
source
==
null
?
null
:
ZonedDateTime
.
ofInstant
(
source
.
toInstant
(),
ZoneId
.
systemDefault
())
.
toLocalDate
();
}
}
public
static
class
ZonedDateTimeToDateConverter
implements
Converter
<
ZonedDateTime
,
Date
>
{
public
static
final
ZonedDateTimeToDateConverter
INSTANCE
=
new
ZonedDateTimeToDateConverter
();
private
ZonedDateTimeToDateConverter
()
{
}
@Override
public
Date
convert
(
ZonedDateTime
source
)
{
return
source
==
null
?
null
:
Date
.
from
(
source
.
toInstant
());
}
}
public
static
class
DateToZonedDateTimeConverter
implements
Converter
<
Date
,
ZonedDateTime
>
{
public
static
final
DateToZonedDateTimeConverter
INSTANCE
=
new
DateToZonedDateTimeConverter
();
private
DateToZonedDateTimeConverter
()
{
}
@Override
public
ZonedDateTime
convert
(
Date
source
)
{
return
source
==
null
?
null
:
ZonedDateTime
.
ofInstant
(
source
.
toInstant
(),
ZoneId
.
systemDefault
());
}
}
public
static
class
LocalDateTimeToDateConverter
implements
Converter
<
LocalDateTime
,
Date
>
{
public
static
final
LocalDateTimeToDateConverter
INSTANCE
=
new
LocalDateTimeToDateConverter
();
private
LocalDateTimeToDateConverter
()
{
}
@Override
public
Date
convert
(
LocalDateTime
source
)
{
return
source
==
null
?
null
:
Date
.
from
(
source
.
atZone
(
ZoneId
.
systemDefault
()).
toInstant
());
}
}
public
static
class
DateToLocalDateTimeConverter
implements
Converter
<
Date
,
LocalDateTime
>
{
public
static
final
DateToLocalDateTimeConverter
INSTANCE
=
new
DateToLocalDateTimeConverter
();
private
DateToLocalDateTimeConverter
()
{
}
@Override
public
LocalDateTime
convert
(
Date
source
)
{
return
source
==
null
?
null
:
LocalDateTime
.
ofInstant
(
source
.
toInstant
(),
ZoneId
.
systemDefault
());
}
}
public
static
class
DurationToLongConverter
implements
Converter
<
Duration
,
Long
>
{
public
static
final
DurationToLongConverter
INSTANCE
=
new
DurationToLongConverter
();
private
DurationToLongConverter
()
{
}
@Override
public
Long
convert
(
Duration
source
)
{
return
source
==
null
?
null
:
source
.
toNanos
();
}
}
public
static
class
LongToDurationConverter
implements
Converter
<
Long
,
Duration
>
{
public
static
final
LongToDurationConverter
INSTANCE
=
new
LongToDurationConverter
();
private
LongToDurationConverter
()
{
}
@Override
public
Duration
convert
(
Long
source
)
{
return
source
==
null
?
null
:
Duration
.
ofNanos
(
source
);
}
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/helper/RuleUtils.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
helper
;
import
cn.ibizlab.util.domain.EntityBase
;
import
java.lang.reflect.Method
;
import
java.math.BigDecimal
;
import
java.math.BigInteger
;
import
java.sql.Timestamp
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
import
com.alibaba.fastjson.JSONObject
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.util.StringUtils
;
public
class
RuleUtils
{
public
static
SimpleDateFormat
dateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
);
public
static
Object
getObj
(
Object
object
,
String
members
)
{
if
(
object
==
null
)
{
return
null
;
}
Object
currentObj
=
object
;
String
[]
arrayOfString
=
members
.
split
(
"\\."
);
int
i
=
arrayOfString
.
length
;
for
(
int
j
=
0
;
j
<
i
;
++
j
)
{
String
methodName
=
arrayOfString
[
j
];
try
{
if
(
currentObj
instanceof
EntityBase
)
{
currentObj
=((
EntityBase
)
currentObj
).
get
(
methodName
);
if
(
currentObj
==
null
)
{
return
null
;
}
}
else
if
(
currentObj
instanceof
JSONObject
)
{
currentObj
=((
JSONObject
)
currentObj
).
get
(
methodName
);
if
(
currentObj
==
null
)
{
return
null
;
}
}
else
if
(
currentObj
instanceof
Map
)
{
currentObj
=((
Map
)
currentObj
).
get
(
methodName
);
if
(
currentObj
==
null
)
{
return
null
;
}
}
else
{
Class
clazz
=
currentObj
.
getClass
();
Method
method
=
null
;
try
{
method
=
clazz
.
getMethod
(
"get"
,
new
Class
[
0
]);
}
catch
(
Exception
e2
)
{
method
=
clazz
.
getDeclaredMethod
(
"get"
,
new
Class
[
0
]);
}
currentObj
=
method
.
invoke
(
currentObj
,
methodName
);
if
(
currentObj
==
null
){
return
null
;
}
}
}
catch
(
Exception
e
)
{
return
null
;
}
}
return
currentObj
;
}
public
static
boolean
test
(
Object
finalObject
,
String
option
,
Object
exp
)
{
if
(
option
.
equalsIgnoreCase
(
"eq"
)||
option
.
equalsIgnoreCase
(
"equal"
)||
option
.
equalsIgnoreCase
(
"="
)){
return
equal
(
exp
,
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"noteq"
)||
option
.
equalsIgnoreCase
(
"notequal"
)||
option
.
equalsIgnoreCase
(
"<>"
)||
option
.
equalsIgnoreCase
(
"!="
)){
return
!
equal
(
exp
,
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"gt"
)||
option
.
equalsIgnoreCase
(
">"
)){
return
gt
(
exp
,
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"lt"
)||
option
.
equalsIgnoreCase
(
"<"
)){
return
lt
(
exp
,
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"gtandeq"
)||
option
.
equalsIgnoreCase
(
"ge"
)||
option
.
equalsIgnoreCase
(
">="
)){
return
ge
(
exp
,
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"ltandeq"
)||
option
.
equalsIgnoreCase
(
"le"
)||
option
.
equalsIgnoreCase
(
"<="
)){
return
le
(
exp
,
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"null"
)||
option
.
equalsIgnoreCase
(
"isnull"
)){
return
isNull
(
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"notnull"
)||
option
.
equalsIgnoreCase
(
"isnotnull"
)){
return
isNotNull
(
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"like"
)||
option
.
equalsIgnoreCase
(
"matchor"
)){
return
matchor
(
exp
,
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"leftlike"
)||
option
.
equalsIgnoreCase
(
"startswith"
)||
option
.
equalsIgnoreCase
(
"begin"
)){
return
leftmatchor
(
exp
,
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"rightlike"
)||
option
.
equalsIgnoreCase
(
"endswith"
)||
option
.
equalsIgnoreCase
(
"end"
)){
return
rightmatchor
(
exp
,
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"match"
)||
option
.
equalsIgnoreCase
(
"matchand"
)||
option
.
equalsIgnoreCase
(
"matches"
)){
return
matchand
(
exp
,
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"in"
)){
return
in
(
exp
,
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"notin"
)){
return
notin
(
exp
,
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"NOTLIKE"
)){
return
notmatchor
(
exp
,
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"LEFTNOTLIKE"
)){
return
!
leftmatchor
(
exp
,
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"RIGHTNOTLIKE"
)){
return
!
rightmatchor
(
exp
,
finalObject
);
}
else
if
(
option
.
equalsIgnoreCase
(
"NOTMATCHES"
)){
return
notmatchand
(
exp
,
finalObject
);
}
else
{
return
false
;
}
}
public
static
boolean
equal
(
Object
exp
,
Object
object
,
String
members
)
{
return
equal
(
exp
,
getObj
(
object
,
members
));
}
public
static
boolean
equal
(
Object
exp
,
Object
finalObject
)
{
if
(
exp
==
null
){
return
false
;
}
if
(
finalObject
==
null
){
return
false
;
}
if
(
exp
instanceof
String
&&
((
String
)
exp
).
length
()==
10
&&
finalObject
instanceof
Timestamp
)
{
return
dateFormat
.
format
(
finalObject
).
equals
(
exp
);
}
else
if
(
exp
instanceof
Timestamp
&&
finalObject
instanceof
Timestamp
)
{
return
dateFormat
.
format
(
finalObject
).
equals
(
dateFormat
.
format
(
exp
));
}
else
if
(
finalObject
instanceof
Timestamp
)
{
Timestamp
tm
=
DataObject
.
getTimestampValue
(
exp
,
null
);
if
(
tm
==
null
)
return
false
;
return
ObjectUtils
.
nullSafeEquals
(
tm
,
finalObject
);
}
if
(
ObjectUtils
.
nullSafeEquals
(
exp
,
finalObject
)){
return
true
;
}
if
(
exp
.
toString
().
equalsIgnoreCase
(
finalObject
.
toString
())){
return
true
;
}
return
false
;
}
public
static
boolean
gt
(
Object
exp
,
Object
object
,
String
members
)
{
return
gt
(
exp
,
getObj
(
object
,
members
));
}
public
static
boolean
gt
(
Object
exp
,
Object
finalObject
)
{
if
(
ObjectUtils
.
isEmpty
(
exp
)){
return
false
;
}
if
(
ObjectUtils
.
isEmpty
(
finalObject
)){
return
false
;
}
try
{
if
(
finalObject
instanceof
java
.
sql
.
Timestamp
)
{
java
.
sql
.
Timestamp
finalTime
=(
java
.
sql
.
Timestamp
)
finalObject
;
Timestamp
tm
=
null
;
if
(
exp
instanceof
java
.
sql
.
Timestamp
)
{
tm
=(
java
.
sql
.
Timestamp
)
exp
;
}
else
{
tm
=
DataObject
.
getTimestampValue
(
exp
,
null
);
if
(
tm
==
null
){
return
false
;
}
}
return
finalTime
.
getTime
()>
tm
.
getTime
();
}
else
if
(
finalObject
instanceof
Integer
)
{
return
((
Integer
)
finalObject
)
>
DataObject
.
getIntegerValue
(
exp
,
Integer
.
MAX_VALUE
);
}
else
if
(
finalObject
instanceof
Double
)
{
return
((
Double
)
finalObject
)
>
DataObject
.
getDoubleValue
(
exp
,
Double
.
MAX_VALUE
);
}
else
if
(
finalObject
instanceof
Float
)
{
return
((
Float
)
finalObject
)
>
DataObject
.
getFloatValue
(
exp
,
Float
.
MAX_VALUE
);
}
else
if
(
finalObject
instanceof
BigDecimal
)
{
return
((
BigDecimal
)
finalObject
).
compareTo
(
DataObject
.
getBigDecimalValue
(
exp
,
BigDecimal
.
valueOf
(
Double
.
MAX_VALUE
)))>
0
;
}
else
if
(
finalObject
instanceof
BigInteger
)
{
return
((
BigInteger
)
finalObject
).
compareTo
(
DataObject
.
getBigIntegerValue
(
exp
,
BigInteger
.
valueOf
(
Long
.
MAX_VALUE
)))>
0
;
}
else
if
(
finalObject
instanceof
Long
)
{
return
((
Long
)
finalObject
)
>
DataObject
.
getLongValue
(
exp
,
Long
.
MAX_VALUE
);
}
else
if
(
finalObject
instanceof
String
)
{
return
finalObject
.
toString
().
compareToIgnoreCase
(
exp
.
toString
())>
0
;
}
else
{
return
false
;
}
}
catch
(
Exception
ex
)
{
return
false
;
}
}
public
static
boolean
lt
(
Object
exp
,
Object
object
,
String
members
)
{
return
lt
(
exp
,
getObj
(
object
,
members
));
}
public
static
boolean
lt
(
Object
exp
,
Object
finalObject
)
{
if
(
ObjectUtils
.
isEmpty
(
exp
)){
return
false
;
}
if
(
ObjectUtils
.
isEmpty
(
finalObject
)){
return
false
;
}
try
{
if
(
finalObject
instanceof
java
.
sql
.
Timestamp
)
{
java
.
sql
.
Timestamp
finalTime
=(
java
.
sql
.
Timestamp
)
finalObject
;
Timestamp
tm
=
null
;
if
((
exp
instanceof
String
)&&
(
exp
.
toString
().
trim
().
length
()==
10
))
{
tm
=
new
Timestamp
(
dateFormat
.
parse
(
exp
.
toString
().
trim
()).
getTime
());
}
else
if
(
exp
instanceof
java
.
sql
.
Timestamp
)
{
tm
=(
java
.
sql
.
Timestamp
)
exp
;
}
else
{
return
false
;
}
return
finalTime
.
getTime
()<
tm
.
getTime
();
}
else
if
(
finalObject
instanceof
Integer
)
{
return
Integer
.
parseInt
(
finalObject
.
toString
())
<
Integer
.
parseInt
(
exp
.
toString
());
}
else
if
(
finalObject
instanceof
Double
)
{
return
Double
.
parseDouble
(
finalObject
.
toString
())
<
Double
.
parseDouble
(
exp
.
toString
());
}
else
if
(
finalObject
instanceof
Float
)
{
return
Float
.
parseFloat
(
finalObject
.
toString
())
<
Float
.
parseFloat
(
exp
.
toString
());
}
else
if
(
finalObject
instanceof
String
)
{
return
finalObject
.
toString
().
compareToIgnoreCase
(
exp
.
toString
())<
0
;
}
else
if
(
finalObject
instanceof
Long
)
{
return
Long
.
parseLong
(
finalObject
.
toString
())
<
Long
.
parseLong
(
exp
.
toString
());
}
else
return
false
;
}
catch
(
Exception
ex
)
{
return
false
;
}
}
public
static
boolean
ge
(
Object
exp
,
Object
object
,
String
members
)
{
return
ge
(
exp
,
getObj
(
object
,
members
));
}
public
static
boolean
ge
(
Object
exp
,
Object
finalObject
)
{
if
(
ObjectUtils
.
isEmpty
(
exp
)){
return
false
;
}
if
(
ObjectUtils
.
isEmpty
(
finalObject
)){
return
false
;
}
return
(!(
lt
(
exp
,
finalObject
)));
}
public
static
boolean
le
(
Object
exp
,
Object
object
,
String
members
)
{
return
le
(
exp
,
getObj
(
object
,
members
));
}
public
static
boolean
le
(
Object
exp
,
Object
finalObject
)
{
if
(
ObjectUtils
.
isEmpty
(
exp
)){
return
false
;
}
if
(
ObjectUtils
.
isEmpty
(
finalObject
)){
return
false
;
}
return
(!(
gt
(
exp
,
finalObject
)));
}
public
static
boolean
notin
(
Object
expObj
,
Object
object
,
String
members
)
{
return
notin
(
expObj
,
getObj
(
object
,
members
));
}
public
static
boolean
notin
(
Object
expObj
,
Object
finalObject
)
{
if
(
ObjectUtils
.
isEmpty
(
finalObject
))
return
true
;
if
(
ObjectUtils
.
isEmpty
(
expObj
))
return
false
;
String
tvs
=
expObj
.
toString
().
trim
();
if
(
StringUtils
.
isEmpty
(
tvs
)){
return
false
;
}
return
(!
in
(
expObj
,
finalObject
));
}
public
static
boolean
in
(
Object
expObj
,
Object
object
,
String
members
)
{
return
in
(
expObj
,
getObj
(
object
,
members
));
}
public
static
boolean
in
(
Object
expObj
,
Object
finalObject
)
{
if
(
ObjectUtils
.
isEmpty
(
finalObject
))
return
false
;
if
(
ObjectUtils
.
isEmpty
(
expObj
))
return
false
;
String
tvs
=
expObj
.
toString
().
trim
();
if
(
StringUtils
.
isEmpty
(
tvs
)){
return
false
;
}
if
(
finalObject
instanceof
Integer
)
{
tvs
=
"i:"
+
tvs
;
}
else
if
(
finalObject
instanceof
String
)
{
tvs
=
"s:"
+
tvs
;
}
List
acts
=
parseTvs
(
tvs
);
for
(
Iterator
localIterator
=
acts
.
iterator
();
localIterator
.
hasNext
();)
{
Object
act
=
localIterator
.
next
();
if
(
equal
(
act
,
finalObject
))
return
true
;
}
return
false
;
}
public
static
boolean
isNotNull
(
Object
object
,
String
members
)
{
return
isNotNull
(
getObj
(
object
,
members
));
}
public
static
boolean
isNotNull
(
Object
finalObject
)
{
return
!
isNull
(
finalObject
);
}
public
static
boolean
isNull
(
Object
object
,
String
members
)
{
return
isNull
(
getObj
(
object
,
members
));
}
public
static
boolean
isNull
(
Object
finalObject
)
{
if
(
finalObject
instanceof
String
){
return
StringUtils
.
isEmpty
(
finalObject
.
toString
().
trim
());
}
return
(
ObjectUtils
.
isEmpty
(
finalObject
));
}
public
static
boolean
notmatchor
(
Object
expObj
,
Object
object
,
String
members
)
{
return
notmatchor
(
expObj
,
getObj
(
object
,
members
));
}
public
static
boolean
notmatchor
(
Object
expObj
,
Object
obj
)
{
if
(
ObjectUtils
.
isEmpty
(
obj
)){
return
true
;
}
if
(
ObjectUtils
.
isEmpty
(
expObj
)){
return
false
;
}
String
exp
=
expObj
.
toString
().
trim
();
if
(
StringUtils
.
isEmpty
(
exp
)){
return
false
;
}
return
(!
matchor
(
expObj
,
obj
));
}
public
static
boolean
notmatchand
(
Object
expObj
,
Object
object
,
String
members
)
{
return
notmatchand
(
expObj
,
getObj
(
object
,
members
));
}
public
static
boolean
notmatchand
(
Object
expObj
,
Object
finalObject
)
{
if
(
ObjectUtils
.
isEmpty
(
finalObject
)){
return
true
;
}
if
(
ObjectUtils
.
isEmpty
(
expObj
)){
return
false
;
}
String
exp
=
expObj
.
toString
().
trim
();
if
(
StringUtils
.
isEmpty
(
exp
)){
return
false
;
}
return
(!
matchand
(
expObj
,
finalObject
));
}
public
static
boolean
matchor
(
Object
expObj
,
Object
object
,
String
members
)
{
return
matchor
(
expObj
,
getObj
(
object
,
members
));
}
public
static
boolean
matchor
(
Object
expObj
,
Object
obj
)
{
if
(
ObjectUtils
.
isEmpty
(
obj
)){
return
false
;
}
if
(
ObjectUtils
.
isEmpty
(
expObj
)){
return
false
;
}
String
exp
=
expObj
.
toString
().
trim
();
if
(
StringUtils
.
isEmpty
(
exp
)){
return
false
;
}
exp
=
exp
.
replace
(
";"
,
","
);
exp
=
exp
.
replace
(
";"
,
","
);
exp
=
exp
.
replace
(
","
,
","
);
String
[]
arr
=
exp
.
split
(
","
);
boolean
bRt
=
false
;
for
(
String
strExp:
arr
)
{
bRt
=(
obj
.
toString
()).
matches
(
"(.*)"
+(
strExp
)+
"(.*)"
);
if
(
bRt
)
return
true
;
}
return
bRt
;
}
public
static
boolean
leftmatchor
(
Object
expObj
,
Object
obj
)
{
if
(
ObjectUtils
.
isEmpty
(
obj
)){
return
false
;
}
if
(
ObjectUtils
.
isEmpty
(
expObj
)){
return
false
;
}
String
exp
=
expObj
.
toString
().
trim
();
if
(
StringUtils
.
isEmpty
(
exp
)){
return
false
;
}
exp
=
exp
.
replace
(
";"
,
","
);
exp
=
exp
.
replace
(
";"
,
","
);
exp
=
exp
.
replace
(
","
,
","
);
String
[]
arr
=
exp
.
split
(
","
);
boolean
bRt
=
false
;
for
(
String
strExp:
arr
)
{
bRt
=
obj
.
toString
().
matches
(
strExp
+
"(.*)"
);
if
(
bRt
){
return
true
;
}
}
return
bRt
;
}
public
static
boolean
rightmatchor
(
Object
expObj
,
Object
obj
)
{
if
(
ObjectUtils
.
isEmpty
(
obj
)){
return
false
;
}
if
(
ObjectUtils
.
isEmpty
(
expObj
)){
return
false
;
}
String
exp
=
expObj
.
toString
().
trim
();
if
(
StringUtils
.
isEmpty
(
exp
)){
return
false
;
}
exp
=
exp
.
replace
(
";"
,
","
);
exp
=
exp
.
replace
(
";"
,
","
);
exp
=
exp
.
replace
(
","
,
","
);
String
[]
arr
=
exp
.
split
(
","
);
boolean
bRt
=
false
;
for
(
String
strExp:
arr
)
{
bRt
=
obj
.
toString
().
matches
(
"(.*)"
+
strExp
);
if
(
bRt
){
return
true
;
}
}
return
bRt
;
}
public
static
boolean
matchand
(
Object
expObj
,
Object
object
,
String
members
)
{
return
matchand
(
expObj
,
getObj
(
object
,
members
));
}
public
static
boolean
matchand
(
Object
expObj
,
Object
obj
)
{
if
(
ObjectUtils
.
isEmpty
(
obj
)){
return
false
;
}
if
(
ObjectUtils
.
isEmpty
(
expObj
)){
return
false
;
}
String
exp
=
expObj
.
toString
().
trim
();
if
(
StringUtils
.
isEmpty
(
exp
)){
return
false
;
}
exp
=
exp
.
replace
(
";"
,
","
);
exp
=
exp
.
replace
(
";"
,
","
);
exp
=
exp
.
replace
(
","
,
","
);
String
[]
arr
=
exp
.
split
(
","
);
String
objstr
=
obj
.
toString
();
boolean
bRt
=
true
;
for
(
String
strExp:
arr
)
{
if
(
strExp
.
trim
().
length
()==
0
){
continue
;
}
bRt
=(
obj
.
toString
()).
matches
(
"(.*)"
+(
strExp
)+
"(.*)"
);
if
(!
bRt
){
return
false
;
}
}
return
bRt
;
}
private
static
List
<
Object
>
parseTvs
(
String
tvs
)
{
tvs
=
tvs
.
replace
(
";"
,
","
);
tvs
=
tvs
.
replace
(
";"
,
","
);
tvs
=
tvs
.
replace
(
","
,
","
);
String
[]
arrayOfString1
;
int
j
;
int
k
;
String
value
;
String
type
=
"s"
;
String
values
=
""
;
String
[]
tv
=
tvs
.
split
(
":"
);
if
(
tv
.
length
>
1
)
{
type
=
tv
[
0
];
values
=
tv
[
1
];
}
else
{
values
=
tvs
;
}
List
acts
=
new
ArrayList
();
String
str1
=
type
;
int
i
=
-
1
;
switch
(
str1
.
hashCode
())
{
case
105
:
if
(
str1
.
equals
(
"i"
)){
i
=
0
;
}
break
;
case
115
:
if
(
str1
.
equals
(
"s"
)){
i
=
1
;
}
}
switch
(
i
)
{
case
0
:
arrayOfString1
=
values
.
split
(
","
);
j
=
arrayOfString1
.
length
;
for
(
k
=
0
;
k
<
j
;
++
k
)
{
value
=
arrayOfString1
[
k
];
acts
.
add
(
new
Integer
(
value
.
trim
()));
}
break
;
case
1
:
arrayOfString1
=
values
.
split
(
","
);
j
=
arrayOfString1
.
length
;
for
(
k
=
0
;
k
<
j
;
++
k
)
{
value
=
arrayOfString1
[
k
];
acts
.
add
(
value
.
trim
());
}
}
return
acts
;
}
public
static
boolean
inc2s
(
String
tvs
,
Object
finalObject
)
{
if
(
ObjectUtils
.
isEmpty
(
finalObject
))
return
false
;
if
(
StringUtils
.
isEmpty
(
tvs
))
return
false
;
if
(
finalObject
instanceof
String
)
{
tvs
=
"s:"
+
tvs
;
}
else
return
false
;
List
acts
=
parseTvs
(
tvs
);
for
(
Iterator
localIterator
=
acts
.
iterator
();
localIterator
.
hasNext
();)
{
Object
act
=
localIterator
.
next
();
if
(
equal
(
c2s
(
act
.
toString
()),
c2s
(
finalObject
.
toString
())))
return
true
;
}
return
false
;
}
public
static
String
c2s
(
String
str
)
{
if
(
str
==
null
)
return
null
;
if
(
str
.
length
()<
300
)
{
str
=
str
.
trim
();
//1234567890()【】〔2018〕
str
=
str
.
replace
(
"1"
,
"1"
).
replace
(
"2"
,
"2"
).
replace
(
"3"
,
"3"
).
replace
(
"4"
,
"4"
).
replace
(
"5"
,
"5"
).
replace
(
"6"
,
"6"
).
replace
(
"7"
,
"7"
)
.
replace
(
"8"
,
"8"
).
replace
(
"9"
,
"9"
).
replace
(
"0"
,
"0"
)
.
replace
(
"("
,
"〔"
).
replace
(
")"
,
"〕"
)
.
replace
(
"("
,
"〔"
).
replace
(
")"
,
"〕"
)
.
replace
(
"【"
,
"〔"
).
replace
(
"】"
,
"〕"
)
.
replace
(
"["
,
"〔"
).
replace
(
"]"
,
"〕"
);
}
return
str
;
}
public
static
boolean
notinc2s
(
String
tvs
,
Object
finalObject
)
{
return
(!
inc2s
(
tvs
,
finalObject
));
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/helper/Setting.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
helper
;
import
cn.ibizlab.util.domain.EntityBase
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
lombok.Getter
;
import
lombok.NoArgsConstructor
;
import
lombok.Setter
;
import
lombok.experimental.Accessors
;
import
org.springframework.util.StringUtils
;
import
java.io.IOException
;
import
java.io.StringReader
;
import
java.util.*
;
@Getter
@Setter
@NoArgsConstructor
@Accessors
(
chain
=
true
)
public
class
Setting
{
private
String
property
;
private
String
value
;
public
static
String
getValue
(
String
configString
,
String
propertyName
)
{
return
DataObject
.
getStringValue
(
getMap
(
configString
).
get
(
propertyName
),
""
);
}
public
static
<
T
extends
EntityBase
>
T
getEntity
(
String
configString
,
T
entityBase
)
{
if
(
entityBase
!=
null
)
{
Map
map
=
getMap
(
configString
);
map
.
keySet
().
forEach
(
key
->{
entityBase
.
set
(
key
.
toString
(),
map
.
get
(
key
));
});
}
return
entityBase
;
}
public
static
Map
getMap
(
String
configString
)
{
Map
map
=
new
HashMap
();
map
.
put
(
"param"
,
configString
);
if
(!(
StringUtils
.
isEmpty
(
configString
)))
{
try
{
Object
obj
=
JSON
.
parse
(
configString
);
if
(
obj
==
null
)
return
map
;
else
if
(
obj
instanceof
JSONArray
)
{
List
<
Setting
>
settings
=
JSONArray
.
parseArray
(
configString
,
Setting
.
class
);
for
(
Setting
setting:
settings
)
map
.
put
(
setting
.
getProperty
(),
setting
.
getValue
());
}
else
if
(
obj
instanceof
JSONObject
)
{
JSONObject
jo
=
(
JSONObject
)
obj
;
jo
.
keySet
().
forEach
(
key
->{
map
.
put
(
key
,
jo
.
get
(
key
));
});
}
}
catch
(
Exception
ex
)
{
if
(
configString
.
indexOf
(
"="
)>
0
)
{
Properties
proper
=
new
Properties
();
try
{
proper
.
load
(
new
StringReader
(
configString
));
//把字符串转为reader
}
catch
(
IOException
e
)
{
}
Enumeration
enum1
=
proper
.
propertyNames
();
while
(
enum1
.
hasMoreElements
())
{
String
strKey
=
(
String
)
enum1
.
nextElement
();
String
strValue
=
proper
.
getProperty
(
strKey
);
map
.
put
(
strKey
,
strValue
);
}
}
}
}
return
map
;
}
}
src/main/java/cn/ibizlab/util/helper/UniqueNameGenerator.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
helper
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.config.BeanDefinition
;
import
org.springframework.beans.factory.support.BeanDefinitionRegistry
;
import
org.springframework.context.annotation.AnnotationBeanNameGenerator
;
@Slf4j
public
class
UniqueNameGenerator
extends
AnnotationBeanNameGenerator
{
@Override
public
String
generateBeanName
(
BeanDefinition
definition
,
BeanDefinitionRegistry
registry
)
{
//全限定类名
String
beanName
=
definition
.
getBeanClassName
();
return
beanName
;
}
}
src/main/java/cn/ibizlab/util/job/PermissionSyncJob.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
job
;
import
cn.ibizlab.util.client.IBZUAAFeignClient
;
import
cn.ibizlab.util.client.IBZLiteFeignClient
;
import
com.alibaba.fastjson.JSONObject
;
import
com.alibaba.fastjson.JSONArray
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.io.IOUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.context.annotation.Lazy
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.util.DigestUtils
;
import
java.io.InputStream
;
import
java.util.*
;
/**
* 权限:向uaa同步当前系统菜单、权限资源任务类
*/
@Slf4j
@Component
@ConditionalOnProperty
(
name
=
"ibiz.enablePermissionValid"
,
havingValue
=
"true"
)
public
class
PermissionSyncJob
implements
ApplicationRunner
{
@Value
(
"${ibiz.systemid:ibznotify}"
)
private
String
systemId
;
@Value
(
"${ibiz.systemname:ibznotify}"
)
private
String
systemName
;
@Autowired
@Lazy
private
IBZUAAFeignClient
uaaClient
;
@Autowired
@Lazy
IBZLiteFeignClient
liteClient
;
@Override
public
void
run
(
ApplicationArguments
args
)
{
try
{
Thread
.
sleep
(
10000
);
InputStream
permission
=
this
.
getClass
().
getResourceAsStream
(
"/permission/systemResource.json"
);
//权限资源
if
(!
ObjectUtils
.
isEmpty
(
permission
))
{
String
strPermission
=
IOUtils
.
toString
(
permission
,
"UTF-8"
);
JSONObject
system
=
new
JSONObject
()
{{
put
(
"pssystemid"
,
systemId
);
put
(
"pssystemname"
,
systemName
);
put
(
"sysstructure"
,
JSONObject
.
parseObject
(
strPermission
));
put
(
"md5check"
,
DigestUtils
.
md5DigestAsHex
(
strPermission
.
getBytes
()));
}};
if
(
uaaClient
.
syncSysAuthority
(
system
))
{
log
.
info
(
"向[uaa]同步系统资源成功"
);
}
else
{
log
.
error
(
"向[uaa]同步系统资源失败"
);
}
}
}
catch
(
Exception
ex
)
{
log
.
error
(
"向[uaa]同步系统资源失败,请检查[uaa]服务是否正常运行! {}"
,
ex
.
getMessage
());
}
try
{
InputStream
model
=
this
.
getClass
().
getResourceAsStream
(
"/sysmodel/ibznotify.json"
);
//系统模型
if
(!
ObjectUtils
.
isEmpty
(
model
))
{
String
strModel
=
IOUtils
.
toString
(
model
,
"UTF-8"
);
if
(
liteClient
.
syncSysModel
(
JSONObject
.
parseObject
(
strModel
)))
{
log
.
info
(
"向[lite]同步模型成功"
);
}
else
{
log
.
error
(
"向[lite]同步模型失败"
);
}
}
}
catch
(
Exception
ex
)
{
log
.
error
(
"向[lite]同步系统模型失败,请检查[lite]服务是否正常运行! {}"
,
ex
.
getMessage
());
}
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/mapper/IBZConfigMapper.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
mapper
;
import
cn.ibizlab.util.domain.IBZConfig
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
public
interface
IBZConfigMapper
extends
BaseMapper
<
IBZConfig
>{
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/mapper/IBZDataAuditMapper.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
mapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
cn.ibizlab.util.domain.IBZDataAudit
;
public
interface
IBZDataAuditMapper
extends
BaseMapper
<
IBZDataAudit
>
{
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/mapper/IBZUSERMapper.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
mapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
cn.ibizlab.util.domain.IBZUSER
;
public
interface
IBZUSERMapper
extends
BaseMapper
<
IBZUSER
>{
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/rest/AppController.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
rest
;
import
cn.ibizlab.util.errors.BadRequestAlertException
;
import
cn.ibizlab.util.service.IBZConfigService
;
import
com.alibaba.fastjson.JSONObject
;
import
cn.ibizlab.util.security.AuthenticationUser
;
import
cn.ibizlab.util.service.AuthenticationUserService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.security.core.GrantedAuthority
;
import
org.springframework.util.StringUtils
;
import
org.springframework.web.bind.annotation.*
;
import
com.baomidou.mybatisplus.core.toolkit.IdWorker
;
import
java.util.*
;
@RestController
@RequestMapping
(
value
=
""
)
public
class
AppController
{
@Value
(
"${ibiz.enablePermissionValid:false}"
)
boolean
enablePermissionValid
;
//是否开启权限校验
@Value
(
"${ibiz.systemid:ibznotify}"
)
private
String
systemId
;
@Autowired
private
AuthenticationUserService
userDetailsService
;
@RequestMapping
(
method
=
RequestMethod
.
GET
,
value
=
"/appdata"
)
public
ResponseEntity
<
JSONObject
>
getAppData
()
{
JSONObject
appData
=
new
JSONObject
()
;
Set
<
String
>
appMenu
=
new
HashSet
();
Set
<
String
>
uniRes
=
new
HashSet
();
AuthenticationUser
curUser
=
AuthenticationUser
.
getAuthenticationUser
();
if
(
enablePermissionValid
){
Collection
<
GrantedAuthority
>
authorities
=
curUser
.
getAuthorities
();
Iterator
it
=
authorities
.
iterator
();
while
(
it
.
hasNext
())
{
GrantedAuthority
authority
=
(
GrantedAuthority
)
it
.
next
();
String
strAuthority
=
authority
.
getAuthority
();
if
(
strAuthority
.
startsWith
(
"UNIRES_"
+
systemId
))
{
uniRes
.
add
(
strAuthority
.
substring
(
systemId
.
length
()+
8
));
}
else
if
(
strAuthority
.
startsWith
(
"APPMENU_"
+
systemId
)){
appMenu
.
add
(
strAuthority
.
substring
(
systemId
.
length
()+
9
));
}
}
}
Map
<
String
,
Object
>
context
=
new
HashMap
<>();
context
.
putAll
(
curUser
.
getSessionParams
());
context
.
put
(
"srfusername"
,
curUser
.
getPersonname
());
appData
.
put
(
"context"
,
context
);
appData
.
put
(
"unires"
,
uniRes
);
appData
.
put
(
"appmenu"
,
appMenu
);
appData
.
put
(
"enablepermissionvalid"
,
enablePermissionValid
);
if
(
curUser
.
getSuperuser
()==
1
){
appData
.
put
(
"enablepermissionvalid"
,
false
);
}
else
{
appData
.
put
(
"enablepermissionvalid"
,
enablePermissionValid
);
}
fillAppData
(
appData
);
return
ResponseEntity
.
status
(
HttpStatus
.
OK
).
body
(
appData
);
}
@RequestMapping
(
method
=
RequestMethod
.
GET
,
value
=
"${ibiz.auth.logoutpath:v7/logout}"
)
public
void
logout
()
{
if
(
AuthenticationUser
.
getAuthenticationUser
()!=
null
){
userDetailsService
.
resetByUsername
(
AuthenticationUser
.
getAuthenticationUser
().
getUsername
());
}
}
@Autowired
private
IBZConfigService
ibzConfigService
;
@RequestMapping
(
method
=
RequestMethod
.
PUT
,
value
=
"/configs/{configType}/{targetType}"
)
public
ResponseEntity
<
Boolean
>
saveConfig
(
@PathVariable
(
"configType"
)
String
configType
,
@PathVariable
(
"targetType"
)
String
targetType
,
@RequestBody
JSONObject
config
)
{
String
userId
=
AuthenticationUser
.
getAuthenticationUser
().
getUserid
();
if
(
StringUtils
.
isEmpty
(
userId
)){
throw
new
BadRequestAlertException
(
"保存配置失败,参数缺失"
,
"IBZConfig"
,
configType
);
}
return
ResponseEntity
.
ok
(
ibzConfigService
.
saveConfig
(
configType
,
targetType
,
userId
,
config
));
}
@RequestMapping
(
method
=
RequestMethod
.
GET
,
value
=
"/configs/{configType}/{targetType}"
)
public
ResponseEntity
<
JSONObject
>
getConfig
(
@PathVariable
(
"configType"
)
String
configType
,
@PathVariable
(
"targetType"
)
String
targetType
)
{
String
userId
=
AuthenticationUser
.
getAuthenticationUser
().
getUserid
();
if
(
StringUtils
.
isEmpty
(
userId
)){
throw
new
BadRequestAlertException
(
"获取配置失败,参数缺失"
,
"IBZConfig"
,
configType
);
}
return
ResponseEntity
.
ok
(
ibzConfigService
.
getConfig
(
configType
,
targetType
,
userId
));
}
@RequestMapping
(
method
=
RequestMethod
.
GET
,
value
=
"/configs/share/{id}"
)
public
ResponseEntity
<
JSONObject
>
getShareConfig
(
@PathVariable
(
"id"
)
String
id
)
{
JSONObject
jo
=
ibzConfigService
.
getShareConfig
(
id
);
if
(
jo
==
null
)
{
throw
new
BadRequestAlertException
(
"无效的共享配置数据"
,
"IBZConfig"
,
id
);
}
return
ResponseEntity
.
ok
(
jo
);
}
@RequestMapping
(
method
=
RequestMethod
.
GET
,
value
=
"/configs/share/{configType}/{targetType}"
)
public
ResponseEntity
<
String
>
shareConfig
(
@PathVariable
(
"configType"
)
String
configType
,
@PathVariable
(
"targetType"
)
String
targetType
)
{
String
userId
=
AuthenticationUser
.
getAuthenticationUser
().
getUserid
();
if
(
StringUtils
.
isEmpty
(
userId
))
{
throw
new
BadRequestAlertException
(
"分享配置失败,参数缺失"
,
"IBZConfig"
,
configType
);
}
String
id
=
IdWorker
.
get32UUID
();
ibzConfigService
.
saveShareConfig
(
id
,
configType
,
targetType
,
userId
);
return
ResponseEntity
.
ok
(
id
);
}
/**
* 应用参数扩展
* @param appData
*/
protected
void
fillAppData
(
JSONObject
appData
){
}
}
src/main/java/cn/ibizlab/util/rest/AuthenticationController.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
rest
;
import
cn.ibizlab.util.security.AuthenticationInfo
;
import
cn.ibizlab.util.security.AuthenticationUser
;
import
cn.ibizlab.util.security.AuthorizationLogin
;
import
cn.ibizlab.util.security.AuthTokenUtil
;
import
cn.ibizlab.util.service.AuthenticationUserService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.security.core.context.SecurityContextHolder
;
import
org.springframework.security.core.userdetails.UserDetails
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
@RestController
@RequestMapping
(
"/"
)
@ConditionalOnProperty
(
name
=
"ibiz.enablePermissionValid"
,
havingValue
=
"false"
)
public
class
AuthenticationController
{
@Value
(
"${ibiz.jwt.header:Authorization}"
)
private
String
tokenHeader
;
@Autowired
private
AuthTokenUtil
jwtTokenUtil
;
@Autowired
private
AuthenticationUserService
userDetailsService
;
@PostMapping
(
value
=
"${ibiz.auth.path:v7/login}"
)
public
ResponseEntity
<
AuthenticationInfo
>
login
(
@Validated
@RequestBody
AuthorizationLogin
authorizationLogin
){
userDetailsService
.
resetByUsername
(
authorizationLogin
.
getUsername
());
final
AuthenticationUser
authuserdetail
=
userDetailsService
.
loadUserByLogin
(
authorizationLogin
.
getUsername
(),
authorizationLogin
.
getPassword
());
// 生成令牌
final
String
token
=
jwtTokenUtil
.
generateToken
(
authuserdetail
);
// 返回 token
return
ResponseEntity
.
ok
().
body
(
new
AuthenticationInfo
(
token
,
authuserdetail
));
}
@GetMapping
(
value
=
"${ibiz.auth.account:ibizutil/account}"
)
public
ResponseEntity
<
AuthenticationUser
>
getUserInfo
(){
UserDetails
userDetails
=
(
UserDetails
)
SecurityContextHolder
.
getContext
().
getAuthentication
().
getPrincipal
();
AuthenticationUser
authuserdetail
=
new
AuthenticationUser
();
if
(
userDetails
==
null
){
throw
new
RuntimeException
(
"未能获取用户信息"
);
}
else
if
(
userDetails
instanceof
AuthenticationUser
)
{
authuserdetail
=
(
AuthenticationUser
)
userDetails
;
}
else
{
authuserdetail
=
userDetailsService
.
loadUserByUsername
(
userDetails
.
getUsername
());
}
return
ResponseEntity
.
ok
().
body
(
authuserdetail
);
}
}
src/main/java/cn/ibizlab/util/rest/FileController.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
rest
;
import
cn.ibizlab.util.domain.FileItem
;
import
cn.ibizlab.util.service.FileService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.multipart.MultipartFile
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.*
;
@Slf4j
@RestController
@RequestMapping
(
"/"
)
public
class
FileController
{
@Autowired
private
FileService
fileService
;
@PostMapping
(
value
=
"${ibiz.file.uploadpath:ibizutil/upload}"
)
public
ResponseEntity
<
FileItem
>
upload
(
@RequestParam
(
"file"
)
MultipartFile
multipartFile
){
return
ResponseEntity
.
ok
().
body
(
fileService
.
saveFile
(
multipartFile
));
}
private
final
String
defaultdownloadpath
=
"ibizutil/download/{id}"
;
@GetMapping
(
value
=
"${ibiz.file.downloadpath:"
+
defaultdownloadpath
+
"}"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
void
download
(
@PathVariable
String
id
,
HttpServletResponse
response
){
File
file
=
fileService
.
getFile
(
id
);
response
.
setHeader
(
"Content-Disposition"
,
"attachment;filename="
+
getFileName
(
file
.
getName
()));
this
.
sendRespose
(
response
,
file
);
}
protected
void
sendRespose
(
HttpServletResponse
response
,
File
file
){
BufferedInputStream
bis
=
null
;
BufferedOutputStream
bos
=
null
;
try
{
bis
=
new
BufferedInputStream
(
new
FileInputStream
(
file
));
bos
=
new
BufferedOutputStream
(
response
.
getOutputStream
());
byte
[]
buff
=
new
byte
[
2048
];
int
bytesRead
;
while
(-
1
!=
(
bytesRead
=
bis
.
read
(
buff
,
0
,
buff
.
length
)))
{
bos
.
write
(
buff
,
0
,
bytesRead
);
}
}
catch
(
Exception
e
)
{
//throw e;
}
finally
{
if
(
bis
!=
null
)
{
try
{
bis
.
close
();
}
catch
(
IOException
e
)
{
}
}
if
(
bos
!=
null
)
{
try
{
bos
.
close
();
}
catch
(
IOException
e
)
{
}
}
}
}
protected
String
getFileName
(
String
fileName
){
try
{
return
new
String
(
fileName
.
getBytes
(
"utf-8"
),
"iso8859-1"
);
//防止中文乱码
}
catch
(
UnsupportedEncodingException
e
)
{
e
.
printStackTrace
();
}
return
fileName
;
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/security/AuthPermissionEvaluator.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
security
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
lombok.SneakyThrows
;
import
cn.ibizlab.util.annotation.DEField
;
import
cn.ibizlab.util.domain.EntityBase
;
import
cn.ibizlab.util.enums.DEPredefinedFieldType
;
import
cn.ibizlab.util.filter.QueryWrapperContext
;
import
cn.ibizlab.util.helper.DEFieldCacheMap
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.security.access.PermissionEvaluator
;
import
org.springframework.security.core.Authentication
;
import
org.springframework.security.core.GrantedAuthority
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.util.StringUtils
;
import
java.io.Serializable
;
import
java.lang.reflect.ParameterizedType
;
import
java.lang.reflect.Type
;
import
java.util.*
;
import
java.util.function.Consumer
;
/**
* spring security 权限管理类
* 重写权限控制方法
*/
@Component
public
class
AuthPermissionEvaluator
implements
PermissionEvaluator
{
@Value
(
"${ibiz.enablePermissionValid:false}"
)
boolean
enablePermissionValid
;
//是否开启权限校验
/**
* 服务接口鉴权
* @param authentication 用户
* @param entity 实体
* @param action 操作
* @return
*/
@Override
@SneakyThrows
public
boolean
hasPermission
(
Authentication
authentication
,
Object
entity
,
Object
action
)
{
if
(!
enablePermissionValid
){
return
true
;
}
Object
principal
=
authentication
.
getPrincipal
();
if
(
ObjectUtils
.
isEmpty
(
principal
)){
return
false
;
}
AuthenticationUser
authenticationUser
=
(
AuthenticationUser
)
authentication
.
getPrincipal
();
if
(
authenticationUser
.
getSuperuser
()==
1
){
return
true
;
}
String
strAction
=
String
.
valueOf
(
action
);
Set
<
String
>
userAuthorities
=
getAuthorities
(
authentication
,
strAction
);
if
(
userAuthorities
.
size
()==
0
){
return
false
;
}
if
(
isAllData
(
strAction
,
userAuthorities
)){
return
true
;
}
if
(
entity
instanceof
ArrayList
){
List
<
EntityBase
>
entities
=
(
List
<
EntityBase
>)
entity
;
for
(
EntityBase
entityBase:
entities
){
boolean
result
=
actionValid
(
entityBase
,
strAction
,
userAuthorities
,
authenticationUser
);
if
(!
result
){
return
false
;
}
}
}
else
if
(
entity
instanceof
QueryWrapperContext
){
QueryWrapperContext
queryWrapperContext
=
(
QueryWrapperContext
)
entity
;
setPermissionCondToSearchContext
(
getEntity
(
queryWrapperContext
),
queryWrapperContext
,
userAuthorities
,
authenticationUser
);
}
else
{
EntityBase
entityBase
=
(
EntityBase
)
entity
;
return
actionValid
(
entityBase
,
strAction
,
userAuthorities
,
authenticationUser
);
}
return
true
;
}
/**
* 获取实体信息
* @param qc
* @return
*/
@SneakyThrows
private
EntityBase
getEntity
(
QueryWrapperContext
qc
){
EntityBase
entity
=
null
;
Type
type
=
qc
.
getClass
().
getGenericSuperclass
();
if
(
type
instanceof
ParameterizedType
){
ParameterizedType
parameterizedType
=
(
ParameterizedType
)
qc
.
getClass
().
getGenericSuperclass
();
Type
[]
typeArr
=
parameterizedType
.
getActualTypeArguments
();
if
(
typeArr
.
length
>
0
){
Class
<
EntityBase
>
entityClass
=
(
Class
)
typeArr
[
0
];
return
entityClass
.
newInstance
();
}
}
return
entity
;
}
/**
* 在searchContext中拼接权限条件
* @param entity 实体
* @param qc 查询上下文
* @param userAuthorities 用户权限
* @param authenticationUser 当前用户
*/
@SneakyThrows
private
void
setPermissionCondToSearchContext
(
EntityBase
entity
,
QueryWrapperContext
qc
,
Set
<
String
>
userAuthorities
,
AuthenticationUser
authenticationUser
){
if
(
entity
==
null
){
return
;
}
Map
<
String
,
String
>
permissionField
=
getPermissionField
(
entity
);
//获取组织、部门预置属性
String
orgField
=
permissionField
.
get
(
"orgfield"
);
String
orgDeptField
=
permissionField
.
get
(
"orgsecfield"
);
String
createManField
=
permissionField
.
get
(
"createmanfield"
);
Map
<
String
,
Set
<
String
>>
userInfo
=
authenticationUser
.
getOrgInfo
();
Set
<
String
>
orgParent
=
userInfo
.
get
(
"parentorg"
);
Set
<
String
>
orgChild
=
userInfo
.
get
(
"suborg"
);
Set
<
String
>
orgDeptParent
=
userInfo
.
get
(
"parentdept"
);
Set
<
String
>
orgDeptChild
=
userInfo
.
get
(
"subdept"
);
Set
<
String
>
userOrg
=
new
HashSet
<>();
Set
<
String
>
userOrgDept
=
new
HashSet
<>();
Set
<
String
>
userCreateMan
=
new
HashSet
<>();
for
(
String
authority:
userAuthorities
){
if
(
authority
.
endsWith
(
"curorg"
)){
//本单位
userOrg
.
add
(
authenticationUser
.
getOrgid
());
}
else
if
(
authority
.
endsWith
(
"porg"
)){
//上级单位
userOrg
.
addAll
(
orgParent
);
}
else
if
(
authority
.
endsWith
(
"sorg"
)){
//下级单位
userOrg
.
addAll
(
orgChild
);
}
else
if
(
authority
.
endsWith
(
"curorgdept"
)){
//本部门
userOrgDept
.
add
(
authenticationUser
.
getMdeptid
());
}
else
if
(
authority
.
endsWith
(
"porgdept"
)){
//上级部门
userOrgDept
.
addAll
(
orgDeptParent
);
}
else
if
(
authority
.
endsWith
(
"sorgdept"
)){
//下级部门
userOrgDept
.
addAll
(
orgDeptChild
);
}
else
if
(
authority
.
endsWith
(
"createman"
)){
userCreateMan
.
add
(
authority
);
}
}
if
(
userOrg
.
size
()==
0
&&
userOrgDept
.
size
()==
0
&&
userCreateMan
.
size
()==
0
){
qc
.
getSelectCond
().
apply
(
"1<>1"
);
}
else
{
Consumer
<
QueryWrapper
>
consumer
=
qw
->
{
if
(
userOrg
.
size
()>
0
){
Consumer
<
QueryWrapper
>
org
=
orgQw
->
{
orgQw
.
in
(
orgField
,
userOrg
);
};
qw
.
or
(
org
);
}
if
(
userOrgDept
.
size
()>
0
){
Consumer
<
QueryWrapper
>
dept
=
deptQw
->
{
deptQw
.
in
(
orgDeptField
,
userOrgDept
);
};
qw
.
or
(
dept
);
}
if
(
userCreateMan
.
size
()>
0
){
Consumer
<
QueryWrapper
>
createMan
=
createManQw
->
{
createManQw
.
eq
(
createManField
,
authenticationUser
.
getUserid
());
};
qw
.
or
(
createMan
);
}
};
qc
.
getSelectCond
().
and
(
consumer
);
}
}
@Override
public
boolean
hasPermission
(
Authentication
authentication
,
Serializable
id
,
String
action
,
Object
params
)
{
return
true
;
}
/**
* 获取用户权限资源
* @param authentication
* @param action
* @return
*/
private
Set
<
String
>
getAuthorities
(
Authentication
authentication
,
String
action
){
Collection
authorities
=
authentication
.
getAuthorities
();
Set
<
String
>
userAuthorities
=
new
HashSet
();
Iterator
it
=
authorities
.
iterator
();
while
(
it
.
hasNext
())
{
GrantedAuthority
authority
=
(
GrantedAuthority
)
it
.
next
();
if
(
authority
.
getAuthority
().
contains
(
action
)){
userAuthorities
.
add
(
authority
.
getAuthority
());
}
}
return
userAuthorities
;
}
/**
* 是否为全部数据
* @param action
* @param entityDataRange
* @return
*/
private
boolean
isAllData
(
String
action
,
Set
<
String
>
entityDataRange
)
{
for
(
String
dataRange
:
entityDataRange
){
if
(
dataRange
.
endsWith
(
String
.
format
(
"%s-all"
,
action
))){
return
true
;
}
}
return
false
;
}
/**
* 实体行为权限校验
* @param entity
* @param userAuthorities
* @return
*/
private
boolean
actionValid
(
EntityBase
entity
,
String
action
,
Set
<
String
>
userAuthorities
,
AuthenticationUser
authenticationUser
){
Map
<
String
,
String
>
permissionField
=
getPermissionField
(
entity
);
//获取组织、部门预置属性
String
orgField
=
permissionField
.
get
(
"orgfield"
);
String
orgDeptField
=
permissionField
.
get
(
"orgsecfield"
);
String
createManField
=
permissionField
.
get
(
"createmanfield"
);
Map
<
String
,
Set
<
String
>>
userInfo
=
authenticationUser
.
getOrgInfo
();
Set
<
String
>
orgParent
=
userInfo
.
get
(
"parentorg"
);
Set
<
String
>
orgChild
=
userInfo
.
get
(
"suborg"
);
Set
<
String
>
orgDeptParent
=
userInfo
.
get
(
"parentdept"
);
Set
<
String
>
orgDeptChild
=
userInfo
.
get
(
"subdept"
);
Object
orgFieldValue
=
entity
.
get
(
orgField
);
Object
orgDeptFieldValue
=
entity
.
get
(
orgDeptField
);
Object
crateManFieldValue
=
entity
.
get
(
createManField
);
Set
<
String
>
userOrg
=
new
HashSet
<>();
Set
<
String
>
userOrgDept
=
new
HashSet
<>();
for
(
String
authority:
userAuthorities
){
if
(
authority
.
endsWith
(
"curorg"
)){
//本单位
userOrg
.
add
(
authenticationUser
.
getOrgid
());
}
else
if
(
authority
.
endsWith
(
"porg"
)){
//上级单位
userOrg
.
addAll
(
orgParent
);
}
else
if
(
authority
.
endsWith
(
"sorg"
)){
//下级单位
userOrg
.
addAll
(
orgChild
);
}
else
if
(
authority
.
endsWith
(
"curorgdept"
)){
//本部门
userOrgDept
.
add
(
authenticationUser
.
getMdeptid
());
}
else
if
(
authority
.
endsWith
(
"porgdept"
)){
//上级部门
userOrgDept
.
addAll
(
orgDeptParent
);
}
else
if
(
authority
.
endsWith
(
"sorgdept"
)){
//下级部门
userOrgDept
.
addAll
(
orgDeptChild
);
}
}
if
(
action
.
endsWith
(
"Create"
)
||
action
.
endsWith
(
"Save"
)){
if
(!
ObjectUtils
.
isEmpty
(
orgFieldValue
)
&&
!
userOrg
.
contains
(
orgFieldValue
)){
return
false
;
}
if
(!
ObjectUtils
.
isEmpty
(
orgDeptFieldValue
)
&&
!
userOrgDept
.
contains
(
orgDeptFieldValue
)){
return
false
;
}
if
(!
ObjectUtils
.
isEmpty
(
crateManFieldValue
)
&&
!
authenticationUser
.
getUserid
().
equals
(
crateManFieldValue
)){
return
false
;
}
return
true
;
}
else
{
if
(!
ObjectUtils
.
isEmpty
(
orgFieldValue
)
&&
userOrg
.
contains
(
orgFieldValue
)){
return
true
;
}
if
(!
ObjectUtils
.
isEmpty
(
orgDeptFieldValue
)
&&
userOrgDept
.
contains
(
orgDeptFieldValue
)){
return
true
;
}
if
(!
ObjectUtils
.
isEmpty
(
crateManFieldValue
)
&&
authenticationUser
.
getUserid
().
equals
(
crateManFieldValue
)){
return
true
;
}
return
false
;
}
}
/**
* 获取实体权限字段 orgid/orgsecid
* @param entityBase
* @return
*/
private
Map
<
String
,
String
>
getPermissionField
(
EntityBase
entityBase
){
Map
<
String
,
String
>
permissionFiled
=
new
HashMap
<>();
String
orgField
=
"orgid"
;
//组织属性
String
orgDeptField
=
"orgsectorid"
;
//部门属性
String
createManField
=
"createman"
;
//创建人属性
DEFieldCacheMap
.
getFieldMap
(
entityBase
.
getClass
().
getName
());
Map
<
String
,
DEField
>
preFields
=
DEFieldCacheMap
.
getDEFields
(
entityBase
.
getClass
());
//从缓存中获取当前类预置属性
for
(
Map
.
Entry
<
String
,
DEField
>
entry
:
preFields
.
entrySet
()){
DEField
fieldAnnotation
=
entry
.
getValue
();
//获取注解值
String
fieldName
=
fieldAnnotation
.
name
();
//获取注解字段
DEPredefinedFieldType
prefieldType
=
fieldAnnotation
.
preType
();
if
(!
StringUtils
.
isEmpty
(
fieldName
)){
//用户配置系统预置属性-组织机构标识
if
(
prefieldType
==
prefieldType
.
ORGID
){
orgField
=
fieldName
;
}
//用户配置系统预置属性-部门标识
if
(
prefieldType
==
prefieldType
.
ORGSECTORID
){
orgDeptField
=
fieldName
;
}
//用户配置系统预置属性-部门标识
if
(
prefieldType
==
prefieldType
.
CREATEMAN
){
createManField
=
fieldName
;
}
}
}
permissionFiled
.
put
(
"orgfield"
,
orgField
);
permissionFiled
.
put
(
"orgsecfield"
,
orgDeptField
);
permissionFiled
.
put
(
"createmanfield"
,
createManField
);
return
permissionFiled
;
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/security/AuthTokenUtil.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
security
;
import
org.springframework.security.core.userdetails.UserDetails
;
import
java.util.Date
;
public
interface
AuthTokenUtil
{
String
generateToken
(
UserDetails
userDetails
);
Boolean
validateToken
(
String
token
,
UserDetails
userDetails
);
String
getUsernameFromToken
(
String
token
);
Date
getExpirationDateFromToken
(
String
token
)
;
}
src/main/java/cn/ibizlab/util/security/AuthenticationEntryPoint.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
security
;
import
org.springframework.security.core.AuthenticationException
;
import
org.springframework.stereotype.Component
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.io.Serializable
;
@Component
public
class
AuthenticationEntryPoint
implements
org
.
springframework
.
security
.
web
.
AuthenticationEntryPoint
,
Serializable
{
private
static
final
long
serialVersionUID
=
-
8970718410437077606L
;
@Override
public
void
commence
(
HttpServletRequest
request
,
HttpServletResponse
response
,
AuthenticationException
authException
)
throws
IOException
{
/**
* 当用户尝试访问安全的REST资源而不提供任何凭据时,将调用此方法发送401 响应
*/
response
.
sendError
(
HttpServletResponse
.
SC_UNAUTHORIZED
,
"账号身份已过期,请重新登录。"
);
}
}
src/main/java/cn/ibizlab/util/security/AuthenticationInfo.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
security
;
import
com.fasterxml.jackson.annotation.JsonIgnoreProperties
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
import
java.io.Serializable
;
@Getter
@AllArgsConstructor
@JsonIgnoreProperties
(
ignoreUnknown
=
true
)
public
class
AuthenticationInfo
implements
Serializable
{
private
String
token
;
private
AuthenticationUser
user
;
public
AuthenticationInfo
()
{
}
}
src/main/java/cn/ibizlab/util/security/AuthenticationUser.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
security
;
import
com.fasterxml.jackson.annotation.JsonIgnore
;
import
com.fasterxml.jackson.annotation.JsonIgnoreProperties
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
org.springframework.security.core.GrantedAuthority
;
import
org.springframework.security.core.context.SecurityContextHolder
;
import
org.springframework.security.core.authority.SimpleGrantedAuthority
;
import
org.springframework.security.authentication.UsernamePasswordAuthenticationToken
;
import
org.springframework.security.core.userdetails.UserDetails
;
import
org.springframework.util.ObjectUtils
;
import
java.sql.Timestamp
;
import
java.util.*
;
import
com.alibaba.fastjson.JSONObject
;
@Data
@AllArgsConstructor
@JsonIgnoreProperties
(
ignoreUnknown
=
true
)
public
class
AuthenticationUser
implements
UserDetails
{
public
AuthenticationUser
(){}
/**
* 用戶标识
*/
private
String
userid
;
/**
* 用户全局名
*/
private
String
username
;
/**
* 用户姓名
*/
private
String
personname
;
/**
* 登录名
*/
private
String
loginname
;
/**
* 用户工号
*/
private
String
usercode
;
/**
* 登录密码
*/
private
String
password
;
/**
* 区属
*/
private
String
domain
;
/**
* 租户
*/
private
String
srfdcid
;
/**
* 系统标识
*/
private
String
srfsystemid
;
/**
/**
* 动态实例标识
*/
private
String
srfdynainstid
;
/**
* 部门标识
*/
private
String
mdeptid
;
/**
* 部门编码
*/
private
String
mdeptcode
;
/**
* 部门名称
*/
private
String
mdeptname
;
/**
* 业务编码
*/
private
String
bcode
;
/**
* 岗位标识
*/
private
String
postid
;
/**
* 岗位代码
*/
private
String
postcode
;
/**
* 岗位名称
*/
private
String
postname
;
/**
* 单位标识
*/
private
String
orgid
;
/**
* 单位编码
*/
private
String
orgcode
;
/**
* 单位名称
*/
private
String
orgname
;
/**
* 昵称别名
*/
private
String
nickname
;
/**
* 邮箱
*/
private
String
email
;
/**
* 社交账号
*/
private
String
avatar
;
/**
* 电话
*/
private
String
phone
;
/**
* 照片
*/
private
String
usericon
;
/**
* 性别
*/
private
String
sex
;
/**
* 出生日期
*/
private
Timestamp
birthday
;
/**
* 证件号码
*/
private
String
certcode
;
/**
* 地址
*/
private
String
addr
;
/**
* 主题
*/
private
String
theme
;
/**
* 字号
*/
private
String
fontsize
;
/**
* 语言
*/
private
String
lang
;
/**
* 备注
*/
private
String
memo
;
/**
* 保留字段
*/
private
String
reserver
;
/**
* 用户上下文参数
*/
private
Map
<
String
,
Object
>
sessionParams
;
/**
* 用户权限资源
*/
@JsonIgnore
private
Collection
<
GrantedAuthority
>
authorities
;
/**
* 是否为超级管理员
*/
private
int
superuser
;
/**
* 用户权限资源
*/
private
JSONObject
permissionList
;
/**
* 用户上下文参数
*/
@JsonIgnore
private
Map
<
String
,
Object
>
userSessionParam
;
/**
* 当前用户上下级组织信息
*/
private
Map
<
String
,
Set
<
String
>>
orgInfo
;
/**
* 上级组织
*/
private
String
porg
;
/**
* 下级组织
*/
private
String
sorg
;
/**
* 上级部门
*/
private
String
pdept
;
/**
* 下级部门
*/
private
String
sdept
;
@JsonIgnore
@Override
public
boolean
isAccountNonExpired
()
{
return
true
;
}
@JsonIgnore
@Override
public
boolean
isAccountNonLocked
()
{
return
true
;
}
@JsonIgnore
@Override
public
boolean
isCredentialsNonExpired
()
{
return
true
;
}
@JsonIgnore
@Override
public
String
getPassword
()
{
return
password
;
}
@Override
public
boolean
isEnabled
()
{
return
true
;
}
public
static
AuthenticationUser
getAuthenticationUser
()
{
if
(
SecurityContextHolder
.
getContext
()==
null
||
SecurityContextHolder
.
getContext
().
getAuthentication
()==
null
||
SecurityContextHolder
.
getContext
().
getAuthentication
().
getPrincipal
()==
null
){
return
new
AuthenticationUser
();
}
Object
userDetails
=
SecurityContextHolder
.
getContext
().
getAuthentication
().
getPrincipal
();
AuthenticationUser
authuserdetail
;
if
(
userDetails
instanceof
AuthenticationUser
)
{
authuserdetail
=
(
AuthenticationUser
)
userDetails
;
}
else
{
authuserdetail
=
new
AuthenticationUser
();
}
return
authuserdetail
;
}
public
static
AuthenticationUser
setAuthenticationUser
(
String
userId
,
String
userName
)
{
AuthenticationUser
user
=
new
AuthenticationUser
();
user
.
setUserid
(
userId
);
user
.
setPersonname
(
userName
);
UsernamePasswordAuthenticationToken
authentication
=
new
UsernamePasswordAuthenticationToken
(
user
,
null
,
user
.
getAuthorities
());
SecurityContextHolder
.
getContext
().
setAuthentication
(
authentication
);
return
user
;
}
public
Map
<
String
,
Object
>
getSessionParams
()
{
if
(
this
.
sessionParams
==
null
)
{
sessionParams
=
getUserSessionParam
();
sessionParams
.
put
(
"srfsystemid"
,
this
.
getSrfsystemid
());
sessionParams
.
put
(
"srfpersonid"
,
this
.
getUserid
());
sessionParams
.
put
(
"srfpersonname"
,
this
.
getPersonname
());
sessionParams
.
put
(
"srforgsectorid"
,
this
.
getMdeptid
());
sessionParams
.
put
(
"srforgsectorcode"
,
this
.
getMdeptcode
());
sessionParams
.
put
(
"srforgsectorname"
,
this
.
getMdeptname
());
sessionParams
.
put
(
"srforgid"
,
this
.
getOrgid
());
sessionParams
.
put
(
"srforgcode"
,
this
.
getOrgcode
());
sessionParams
.
put
(
"srforgname"
,
this
.
getOrgname
());
sessionParams
.
put
(
"srfuserid"
,
this
.
getUserid
());
sessionParams
.
put
(
"srfusername"
,
this
.
getPersonname
());
sessionParams
.
put
(
"srfusermode"
,
""
);
sessionParams
.
put
(
"srforgsectorbc"
,
this
.
getBcode
());
sessionParams
.
put
(
"srfloginname"
,
this
.
getLoginname
());
sessionParams
.
put
(
"srflocale"
,
this
.
getLang
());
sessionParams
.
put
(
"srftimezone"
,
""
);
sessionParams
.
put
(
"srfusercode"
,
this
.
getUsercode
());
sessionParams
.
put
(
"srfporg"
,
this
.
getPorg
());
sessionParams
.
put
(
"srfsorg"
,
this
.
getSorg
());
sessionParams
.
put
(
"srfpdept"
,
this
.
getPdept
());
sessionParams
.
put
(
"srfsdept"
,
this
.
getSdept
());
}
return
this
.
sessionParams
;
}
private
Map
<
String
,
Object
>
getUserSessionParam
()
{
if
(
userSessionParam
!=
null
){
return
userSessionParam
;
}
else
{
return
new
HashMap
<>();
}
}
public
void
setOrgInfo
(
Map
<
String
,
Set
<
String
>>
orgInfo
)
{
this
.
orgInfo
=
orgInfo
;
if
(!
ObjectUtils
.
isEmpty
(
orgInfo
)
&&
!
ObjectUtils
.
isEmpty
(
orgInfo
.
get
(
"parentorg"
))){
porg
=(
String
.
format
(
"'%s'"
,
String
.
join
(
"','"
,
orgInfo
.
get
(
"parentorg"
))));
this
.
getSessionParams
().
put
(
"srfporg"
,
porg
);
}
if
(!
ObjectUtils
.
isEmpty
(
orgInfo
)
&&
!
ObjectUtils
.
isEmpty
(
orgInfo
.
get
(
"suborg"
))
){
sorg
=(
String
.
format
(
"'%s'"
,
String
.
join
(
"','"
,
orgInfo
.
get
(
"suborg"
))));
this
.
getSessionParams
().
put
(
"srfsorg"
,
sorg
);
}
if
(!
ObjectUtils
.
isEmpty
(
orgInfo
)
&&
!
ObjectUtils
.
isEmpty
(
orgInfo
.
get
(
"parentdept"
))){
pdept
=(
String
.
format
(
"'%s'"
,
String
.
join
(
"','"
,
orgInfo
.
get
(
"parentdept"
))));
this
.
getSessionParams
().
put
(
"srfpdept"
,
pdept
);
}
if
(!
ObjectUtils
.
isEmpty
(
orgInfo
)
&&
!
ObjectUtils
.
isEmpty
(
orgInfo
.
get
(
"subdept"
))){
sdept
=(
String
.
format
(
"'%s'"
,
String
.
join
(
"','"
,
orgInfo
.
get
(
"subdept"
))));
this
.
getSessionParams
().
put
(
"srfsdept"
,
sdept
);
}
}
public
void
setPermissionList
(
JSONObject
permissionList
)
{
this
.
permissionList
=
permissionList
;
if
(
authorities
==
null
&&
permissionList
!=
null
){
if
(
permissionList
.
getJSONArray
(
"authorities"
)!=
null
){
authorities
=
new
ArrayList
<>();
permissionList
.
getJSONArray
(
"authorities"
).
forEach
(
item
->
authorities
.
add
(
new
SimpleGrantedAuthority
(
String
.
valueOf
(
item
))));
}
}
}
}
src/main/java/cn/ibizlab/util/security/AuthorizationLogin.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
security
;
import
com.fasterxml.jackson.annotation.JsonIgnoreProperties
;
import
lombok.Getter
;
import
lombok.Setter
;
import
org.springframework.util.StringUtils
;
import
javax.validation.constraints.NotBlank
;
@Getter
@Setter
@JsonIgnoreProperties
(
ignoreUnknown
=
true
)
public
class
AuthorizationLogin
{
private
String
domain
;
@NotBlank
(
message
=
"用户名不能为空"
)
private
String
loginname
;
@NotBlank
(
message
=
"密码不能为空"
)
private
String
password
;
public
String
getUsername
()
{
if
(!
StringUtils
.
isEmpty
(
domain
))
return
loginname
+
"|"
+
domain
;
return
loginname
;
}
@Override
public
String
toString
()
{
return
"AuthorizationLogin{"
+
"domain='"
+
domain
+
'\''
+
", loginname='"
+
loginname
+
'\''
+
", password='××××××'}"
;
}
}
src/main/java/cn/ibizlab/util/security/AuthorizationTokenFilter.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
security
;
import
io.jsonwebtoken.ExpiredJwtException
;
import
lombok.extern.slf4j.Slf4j
;
import
cn.ibizlab.util.service.AuthenticationUserService
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.security.authentication.UsernamePasswordAuthenticationToken
;
import
org.springframework.security.core.context.SecurityContextHolder
;
import
org.springframework.security.core.userdetails.UserDetails
;
import
org.springframework.security.core.userdetails.UserDetailsService
;
import
org.springframework.security.web.authentication.WebAuthenticationDetailsSource
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.AntPathMatcher
;
import
org.springframework.util.PathMatcher
;
import
org.springframework.web.filter.OncePerRequestFilter
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
javax.servlet.FilterChain
;
import
javax.servlet.ServletException
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.util.*
;
import
org.springframework.util.StringUtils
;
@Slf4j
@Component
public
class
AuthorizationTokenFilter
extends
OncePerRequestFilter
{
private
final
AuthenticationUserService
userDetailsService
;
private
final
AuthTokenUtil
authTokenUtil
;
private
final
String
tokenHeader
;
private
Set
<
String
>
excludesPattern
=
new
HashSet
<
String
>();
private
PathMatcher
pathMatcher
=
new
AntPathMatcher
();
public
AuthorizationTokenFilter
(
AuthenticationUserService
userDetailsService
,
AuthTokenUtil
authTokenUtil
,
@Value
(
"${ibiz.jwt.header:Authorization}"
)
String
tokenHeader
)
{
this
.
userDetailsService
=
userDetailsService
;
this
.
authTokenUtil
=
authTokenUtil
;
this
.
tokenHeader
=
tokenHeader
;
}
@Override
protected
void
doFilterInternal
(
HttpServletRequest
request
,
HttpServletResponse
response
,
FilterChain
chain
)
throws
ServletException
,
IOException
{
if
(
isExclusion
(
request
.
getRequestURI
()))
{
chain
.
doFilter
(
request
,
response
);
return
;
}
final
String
requestHeader
=
request
.
getHeader
(
this
.
tokenHeader
);
String
username
=
null
;
String
authToken
=
null
;
if
(
requestHeader
!=
null
&&
requestHeader
.
startsWith
(
"Bearer "
))
{
authToken
=
requestHeader
.
substring
(
7
);
try
{
username
=
authTokenUtil
.
getUsernameFromToken
(
authToken
);
}
catch
(
ExpiredJwtException
e
)
{
log
.
error
(
e
.
getMessage
());
}
}
if
(
username
!=
null
&&
SecurityContextHolder
.
getContext
().
getAuthentication
()
==
null
)
{
UserDetails
userDetails
=
this
.
userDetailsService
.
loadUserByUsername
(
username
);
if
(
authTokenUtil
.
validateToken
(
authToken
,
userDetails
))
{
UsernamePasswordAuthenticationToken
authentication
=
new
UsernamePasswordAuthenticationToken
(
userDetails
,
null
,
userDetails
.
getAuthorities
());
authentication
.
setDetails
(
new
WebAuthenticationDetailsSource
().
buildDetails
(
request
));
SecurityContextHolder
.
getContext
().
setAuthentication
(
authentication
);
}
}
chain
.
doFilter
(
request
,
response
);
}
public
void
setExcludesPattern
(
String
excludesPattern
)
{
this
.
excludesPattern
=
new
HashSet
(
Arrays
.
asList
(
excludesPattern
.
split
(
"\\s*,\\s*"
)));
}
public
void
addExcludePattern
(
String
excludePattern
)
{
excludesPattern
.
add
(
excludePattern
);
}
private
boolean
isExclusion
(
String
requestURI
)
{
if
(
this
.
excludesPattern
==
null
)
{
return
false
;
}
else
{
Iterator
excludeIterator
=
this
.
excludesPattern
.
iterator
();
String
pattern
;
do
{
if
(!
excludeIterator
.
hasNext
())
{
return
false
;
}
pattern
=
(
String
)
excludeIterator
.
next
();
}
while
(!
pathMatcher
.
match
(
pattern
,
requestURI
));
return
true
;
}
}
}
src/main/java/cn/ibizlab/util/security/SimpleTokenUtil.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
security
;
import
io.jsonwebtoken.Claims
;
import
io.jsonwebtoken.Clock
;
import
io.jsonwebtoken.Jwts
;
import
io.jsonwebtoken.SignatureAlgorithm
;
import
io.jsonwebtoken.impl.DefaultClock
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.security.core.context.SecurityContext
;
import
org.springframework.security.core.context.SecurityContextHolder
;
import
org.springframework.security.core.userdetails.UserDetails
;
import
org.springframework.stereotype.Component
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnExpression
;
import
java.io.Serializable
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.Optional
;
import
java.util.function.Function
;
@Component
@ConditionalOnExpression
(
"(!${ibiz.enablePermissionValid:false})&&'${ibiz.auth.token.util:UAATokenUtil}'.equals('SimpleTokenUtil')"
)
public
class
SimpleTokenUtil
implements
AuthTokenUtil
,
Serializable
{
private
static
final
long
serialVersionUID
=
-
3301605591108950415L
;
private
Clock
clock
=
DefaultClock
.
INSTANCE
;
@Value
(
"${ibiz.jwt.secret:ibzsecret}"
)
private
String
secret
;
@Value
(
"${ibiz.jwt.expiration:7200000}"
)
private
Long
expiration
;
@Value
(
"${ibiz.jwt.header:Authorization}"
)
private
String
tokenHeader
;
public
String
getUsernameFromToken
(
String
token
)
{
return
getClaimFromToken
(
token
,
Claims:
:
getSubject
);
}
public
Date
getIssuedAtDateFromToken
(
String
token
)
{
return
getClaimFromToken
(
token
,
Claims:
:
getIssuedAt
);
}
public
Date
getExpirationDateFromToken
(
String
token
)
{
return
getClaimFromToken
(
token
,
Claims:
:
getExpiration
);
}
public
<
T
>
T
getClaimFromToken
(
String
token
,
Function
<
Claims
,
T
>
claimsResolver
)
{
final
Claims
claims
=
getAllClaimsFromToken
(
token
);
return
claimsResolver
.
apply
(
claims
);
}
private
Claims
getAllClaimsFromToken
(
String
token
)
{
return
Jwts
.
parser
()
.
setSigningKey
(
secret
)
.
parseClaimsJws
(
token
)
.
getBody
();
}
private
Boolean
isTokenExpired
(
String
token
)
{
final
Date
expiration
=
getExpirationDateFromToken
(
token
);
return
expiration
.
before
(
clock
.
now
());
}
private
Boolean
isCreatedBeforeLastPasswordReset
(
Date
created
,
Date
lastPasswordReset
)
{
return
(
lastPasswordReset
!=
null
&&
created
.
before
(
lastPasswordReset
));
}
private
Boolean
ignoreTokenExpiration
(
String
token
)
{
// here you specify tokens, for that the expiration is ignored
return
false
;
}
public
String
generateToken
(
UserDetails
userDetails
)
{
Map
<
String
,
Object
>
claims
=
new
HashMap
<>();
return
doGenerateToken
(
claims
,
userDetails
.
getUsername
());
}
private
String
doGenerateToken
(
Map
<
String
,
Object
>
claims
,
String
subject
)
{
final
Date
createdDate
=
clock
.
now
();
final
Date
expirationDate
=
calculateExpirationDate
(
createdDate
);
return
Jwts
.
builder
()
.
setClaims
(
claims
)
.
setSubject
(
subject
)
.
setIssuedAt
(
createdDate
)
.
setExpiration
(
expirationDate
)
.
signWith
(
SignatureAlgorithm
.
HS512
,
secret
)
.
compact
();
}
public
Boolean
canTokenBeRefreshed
(
String
token
,
Date
lastPasswordReset
)
{
final
Date
created
=
getIssuedAtDateFromToken
(
token
);
return
!
isCreatedBeforeLastPasswordReset
(
created
,
lastPasswordReset
)
&&
(!
isTokenExpired
(
token
)
||
ignoreTokenExpiration
(
token
));
}
public
String
refreshToken
(
String
token
)
{
final
Date
createdDate
=
clock
.
now
();
final
Date
expirationDate
=
calculateExpirationDate
(
createdDate
);
final
Claims
claims
=
getAllClaimsFromToken
(
token
);
claims
.
setIssuedAt
(
createdDate
);
claims
.
setExpiration
(
expirationDate
);
return
Jwts
.
builder
()
.
setClaims
(
claims
)
.
signWith
(
SignatureAlgorithm
.
HS512
,
secret
)
.
compact
();
}
public
Boolean
validateToken
(
String
token
,
UserDetails
userDetails
)
{
AuthenticationUser
user
=
(
AuthenticationUser
)
userDetails
;
final
Date
created
=
getIssuedAtDateFromToken
(
token
);
return
(!
isTokenExpired
(
token
)
);
}
private
Date
calculateExpirationDate
(
Date
createdDate
)
{
return
new
Date
(
createdDate
.
getTime
()
+
expiration
);
}
/**
* Get the login of the current user.
*
* @return the login of the current user
*/
public
static
Optional
<
String
>
getCurrentUserLogin
()
{
SecurityContext
securityContext
=
SecurityContextHolder
.
getContext
();
return
Optional
.
ofNullable
(
securityContext
.
getAuthentication
())
.
map
(
authentication
->
{
if
(
authentication
.
getPrincipal
()
instanceof
UserDetails
)
{
UserDetails
springSecurityUser
=
(
UserDetails
)
authentication
.
getPrincipal
();
return
springSecurityUser
.
getUsername
();
}
else
if
(
authentication
.
getPrincipal
()
instanceof
String
)
{
return
(
String
)
authentication
.
getPrincipal
();
}
return
null
;
});
}
/**
* Check if a user is authenticated.
*
* @return true if the user is authenticated, false otherwise
*/
public
static
boolean
isAuthenticated
()
{
SecurityContext
securityContext
=
SecurityContextHolder
.
getContext
();
return
Optional
.
ofNullable
(
securityContext
.
getAuthentication
())
.
map
(
authentication
->
authentication
.
getAuthorities
().
stream
()
.
noneMatch
(
grantedAuthority
->
grantedAuthority
.
getAuthority
().
equals
(
"ANONYMOUS"
)))
.
orElse
(
false
);
}
/**
* If the current user has a specific authority (security role).
* <p>
* The name of this method comes from the isUserInRole() method in the Servlet API
*
* @param authority the authority to check
* @return true if the current user has the authority, false otherwise
*/
public
static
boolean
isCurrentUserInRole
(
String
authority
)
{
SecurityContext
securityContext
=
SecurityContextHolder
.
getContext
();
return
Optional
.
ofNullable
(
securityContext
.
getAuthentication
())
.
map
(
authentication
->
authentication
.
getAuthorities
().
stream
()
.
anyMatch
(
grantedAuthority
->
grantedAuthority
.
getAuthority
().
equals
(
authority
)))
.
orElse
(
false
);
}
}
src/main/java/cn/ibizlab/util/security/SpringContextHolder.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
security
;
import
org.springframework.beans.BeansException
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.context.ApplicationContextAware
;
import
org.springframework.stereotype.Component
;
@Component
public
class
SpringContextHolder
implements
ApplicationContextAware
{
private
static
ApplicationContext
applicationContext
;
@Override
public
void
setApplicationContext
(
ApplicationContext
applicationContext
)
throws
BeansException
{
SpringContextHolder
.
applicationContext
=
applicationContext
;
}
public
static
ApplicationContext
getApplicationContext
()
{
assertApplicationContext
();
return
applicationContext
;
}
@SuppressWarnings
(
"unchecked"
)
public
static
<
T
>
T
getBean
(
String
beanName
)
{
assertApplicationContext
();
return
(
T
)
applicationContext
.
getBean
(
beanName
);
}
public
static
<
T
>
T
getBean
(
Class
<
T
>
requiredType
)
{
assertApplicationContext
();
return
applicationContext
.
getBean
(
requiredType
);
}
private
static
void
assertApplicationContext
()
{
if
(
SpringContextHolder
.
applicationContext
==
null
)
{
throw
new
RuntimeException
(
"applicaitonContext属性为null,请检查是否注入了SpringContextHolder!"
);
}
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/security/UAATokenUtil.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
security
;
import
io.jsonwebtoken.Claims
;
import
io.jsonwebtoken.Clock
;
import
io.jsonwebtoken.Jwts
;
import
io.jsonwebtoken.SignatureAlgorithm
;
import
io.jsonwebtoken.impl.DefaultClock
;
import
lombok.SneakyThrows
;
import
cn.ibizlab.util.client.IBZUAAFeignClient
;
import
org.apache.commons.codec.binary.Base64
;
import
org.apache.commons.io.IOUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnExpression
;
import
org.springframework.security.core.userdetails.UserDetails
;
import
org.springframework.stereotype.Component
;
import
java.io.File
;
import
java.io.FileInputStream
;
import
java.io.Serializable
;
import
java.security.KeyFactory
;
import
java.security.NoSuchAlgorithmException
;
import
java.security.PrivateKey
;
import
java.security.PublicKey
;
import
java.security.spec.InvalidKeySpecException
;
import
java.security.spec.PKCS8EncodedKeySpec
;
import
java.security.spec.X509EncodedKeySpec
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.function.Function
;
@Component
@ConditionalOnExpression
(
"${ibiz.enablePermissionValid:false}||'${ibiz.auth.token.util:UAATokenUtil}'.equals('UAATokenUtil')"
)
public
class
UAATokenUtil
implements
AuthTokenUtil
,
Serializable
{
private
static
final
long
serialVersionUID
=
-
3301605591108950415L
;
private
Clock
clock
=
DefaultClock
.
INSTANCE
;
@Value
(
"${ibiz.jwt.secret:ibzsecret}"
)
private
String
secret
;
@Value
(
"${ibiz.jwt.expiration:7200000}"
)
private
Long
expiration
;
@Value
(
"${ibiz.jwt.header:Authorization}"
)
private
String
tokenHeader
;
@Autowired
private
IBZUAAFeignClient
uaaFeignClient
;
public
String
getUsernameFromToken
(
String
token
)
{
return
getClaimFromToken
(
token
,
Claims:
:
getSubject
);
}
public
Date
getIssuedAtDateFromToken
(
String
token
)
{
return
getClaimFromToken
(
token
,
Claims:
:
getIssuedAt
);
}
public
Date
getExpirationDateFromToken
(
String
token
)
{
return
getClaimFromToken
(
token
,
Claims:
:
getExpiration
);
}
public
<
T
>
T
getClaimFromToken
(
String
token
,
Function
<
Claims
,
T
>
claimsResolver
)
{
final
Claims
claims
=
getAllClaimsFromToken
(
token
);
return
claimsResolver
.
apply
(
claims
);
}
public
Claims
getAllClaimsFromToken
(
String
token
)
{
PublicKey
publicKey
=
getPublicKey
(
getPublicKeyString
());
return
Jwts
.
parser
()
.
setSigningKey
(
publicKey
)
.
parseClaimsJws
(
token
)
.
getBody
();
}
private
Boolean
isTokenExpired
(
String
token
)
{
final
Date
expiration
=
getExpirationDateFromToken
(
token
);
return
expiration
.
before
(
clock
.
now
());
}
public
String
generateToken
(
UserDetails
userDetails
)
{
return
null
;
}
public
Boolean
validateToken
(
String
token
,
UserDetails
userDetails
)
{
AuthenticationUser
user
=
(
AuthenticationUser
)
userDetails
;
final
Date
created
=
getIssuedAtDateFromToken
(
token
);
return
(!
isTokenExpired
(
token
)
);
}
private
String
getPublicKeyString
(){
return
uaaFeignClient
.
getPublicKey
();
}
/**
* 获取PublicKey对象
* @param publicKeyBase64
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
*/
@SneakyThrows
public
PublicKey
getPublicKey
(
String
publicKeyBase64
)
{
byte
[]
byteKey
=
Base64
.
decodeBase64
(
publicKeyBase64
);
X509EncodedKeySpec
x509EncodedKeySpec
=
new
X509EncodedKeySpec
(
byteKey
);
KeyFactory
keyFactory
=
KeyFactory
.
getInstance
(
"RSA"
);
return
keyFactory
.
generatePublic
(
x509EncodedKeySpec
);
}
}
src/main/java/cn/ibizlab/util/service/AuthenticationUserService.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
service
;
import
cn.ibizlab.util.errors.BadRequestAlertException
;
import
cn.ibizlab.util.security.AuthenticationUser
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.cache.annotation.CacheEvict
;
import
org.springframework.cache.annotation.Cacheable
;
import
org.springframework.security.core.userdetails.UserDetails
;
import
org.springframework.security.core.userdetails.UserDetailsService
;
import
org.springframework.stereotype.Service
;
public
interface
AuthenticationUserService
extends
UserDetailsService
{
@Override
@Cacheable
(
value
=
"ibzuaa_users"
,
key
=
"'getByUsername:'+#p0"
)
default
AuthenticationUser
loadUserByUsername
(
String
username
){
return
null
;
}
@Cacheable
(
value
=
"ibzuaa_users"
,
key
=
"'getByUsername:'+#p0"
)
AuthenticationUser
loadUserByLogin
(
String
username
,
String
password
);
@CacheEvict
(
value
=
"ibzuaa_users"
,
key
=
"'glob:*getByUsername:'+#p0"
)
default
void
resetByUsername
(
String
username
){}
}
src/main/java/cn/ibizlab/util/service/FileService.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
service
;
import
cn.ibizlab.util.domain.FileItem
;
import
org.springframework.web.multipart.MultipartFile
;
import
java.io.File
;
public
interface
FileService
{
FileItem
saveFile
(
MultipartFile
multipartFile
);
File
getFile
(
String
fileid
);
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/service/IBZConfigService.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
service
;
import
cn.ibizlab.util.domain.IBZConfig
;
import
cn.ibizlab.util.errors.BadRequestAlertException
;
import
cn.ibizlab.util.helper.DataObject
;
import
cn.ibizlab.util.mapper.IBZConfigMapper
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.cache.annotation.CacheEvict
;
import
org.springframework.cache.annotation.Cacheable
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.StringUtils
;
@Slf4j
@Service
public
class
IBZConfigService
extends
ServiceImpl
<
IBZConfigMapper
,
IBZConfig
>
implements
IService
<
IBZConfig
>
{
@Value
(
"${ibiz.systemid:ibznotify}"
)
private
String
systemId
;
@Value
(
"${ibiz.admin.userid:0100}"
)
private
String
adminuserid
;
@Cacheable
(
value
=
"ibzrt_configs"
,
key
=
"'cfgid:'+#p0+'||'+#p1+'||'+#p2"
)
public
JSONObject
getConfig
(
String
cfgType
,
String
targetType
,
String
userId
)
{
if
(
StringUtils
.
isEmpty
(
userId
)
||
StringUtils
.
isEmpty
(
cfgType
)
||
StringUtils
.
isEmpty
(
targetType
))
{
throw
new
BadRequestAlertException
(
"获取配置失败,参数缺失"
,
"IBZConfig"
,
cfgType
);
}
IBZConfig
config
=
this
.
getOne
(
Wrappers
.
query
(
IBZConfig
.
builder
().
systemId
(
systemId
).
cfgType
(
cfgType
).
targetType
(
targetType
).
userId
(
userId
).
build
()),
false
);
if
(
config
==
null
)
{
config
=
this
.
getOne
(
Wrappers
.
query
(
IBZConfig
.
builder
().
systemId
(
systemId
).
cfgType
(
cfgType
).
targetType
(
targetType
).
userId
(
adminuserid
).
build
()),
false
);
if
(
config
==
null
)
{
return
new
JSONObject
();
}
}
return
JSON
.
parseObject
(
config
.
getCfg
());
}
@CacheEvict
(
value
=
"ibzrt_configs"
,
key
=
"'cfgid:'+#p0+'||'+#p1+'||'+#p2"
)
public
boolean
saveConfig
(
String
cfgType
,
String
targetType
,
String
userId
,
JSONObject
config
)
{
if
(
StringUtils
.
isEmpty
(
userId
)
||
StringUtils
.
isEmpty
(
cfgType
)
||
StringUtils
.
isEmpty
(
targetType
))
{
throw
new
BadRequestAlertException
(
"保存配置失败,参数缺失"
,
"IBZConfig"
,
cfgType
);
}
String
cfg
=
"{}"
;
if
(
config
!=
null
)
{
cfg
=
JSONObject
.
toJSONString
(
config
);
}
return
this
.
saveOrUpdate
(
IBZConfig
.
builder
().
systemId
(
systemId
).
cfgType
(
cfgType
).
targetType
(
targetType
).
userId
(
userId
).
cfg
(
cfg
).
updateDate
(
DataObject
.
getNow
()).
build
());
}
@CacheEvict
(
value
=
"ibzrt_configs"
,
key
=
"'cfgid:'+#p0+'||'+#p1+'||'+#p2"
)
public
void
resetConfig
(
String
cfgType
,
String
targetType
,
String
userId
)
{
if
(
StringUtils
.
isEmpty
(
userId
)
||
StringUtils
.
isEmpty
(
cfgType
)
||
StringUtils
.
isEmpty
(
targetType
))
{
throw
new
BadRequestAlertException
(
"重置配置失败,参数缺失"
,
"IBZConfig"
,
cfgType
);
}
this
.
remove
(
Wrappers
.
query
(
IBZConfig
.
builder
().
systemId
(
systemId
).
cfgType
(
cfgType
).
targetType
(
targetType
).
userId
(
userId
).
build
()));
}
@Cacheable
(
value
=
"ibzrt_shareconfigs"
,
key
=
"'cfgid:'+#p0"
)
public
JSONObject
saveShareConfig
(
String
id
,
String
cfgType
,
String
targetType
,
String
userId
){
return
this
.
getConfig
(
cfgType
,
targetType
,
userId
);
}
@Cacheable
(
value
=
"ibzrt_shareconfigs"
,
key
=
"'cfgid:'+#p0"
)
public
JSONObject
getShareConfig
(
String
id
){
return
null
;
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/service/IBZDataAuditService.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
service
;
import
cn.ibizlab.util.annotation.Audit
;
import
cn.ibizlab.util.domain.EntityBase
;
import
org.springframework.scheduling.annotation.Async
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.Map
;
/**
* 实体[DataAudit] 服务对象接口
*/
public
interface
IBZDataAuditService
{
@Async
(
"asyncExecutor"
)
void
createAudit
(
HttpServletRequest
request
,
EntityBase
entity
,
Object
idValue
,
Map
<
String
,
Audit
>
auditFields
);
@Async
(
"asyncExecutor"
)
void
updateAudit
(
HttpServletRequest
request
,
EntityBase
beforeEntity
,
Object
serviceObj
,
Object
idValue
,
Map
<
String
,
Audit
>
auditFields
);
@Async
(
"asyncExecutor"
)
void
removeAudit
(
HttpServletRequest
request
,
EntityBase
entity
,
Object
idValue
,
Map
<
String
,
Audit
>
auditFields
);
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/service/IBZUAAUserService.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
service
;
import
com.alibaba.fastjson.JSONObject
;
import
cn.ibizlab.util.client.IBZOUFeignClient
;
import
cn.ibizlab.util.errors.BadRequestAlertException
;
import
cn.ibizlab.util.client.IBZUAAFeignClient
;
import
cn.ibizlab.util.security.AuthenticationUser
;
import
cn.ibizlab.util.security.AuthorizationLogin
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.DigestUtils
;
import
org.springframework.util.StringUtils
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnExpression
;
/**
* 实体[IBZUSER] 服务对象接口实现
*/
@Service
(
"IBZUAAUserService"
)
@ConditionalOnExpression
(
"${ibiz.enablePermissionValid:false}||'${ibiz.auth.service:IBZUAAUserService}'.equals('IBZUAAUserService')"
)
public
class
IBZUAAUserService
implements
AuthenticationUserService
{
@Autowired
private
IBZUAAFeignClient
uaaFeignClient
;
@Override
public
AuthenticationUser
loadUserByUsername
(
String
username
)
{
AuthenticationUser
user
=
uaaFeignClient
.
loginByUsername
(
username
);
if
(
user
==
null
)
{
throw
new
BadRequestAlertException
(
"登录失败"
,
"IBZUAAUser"
,
username
);
}
return
user
;
}
@Override
public
AuthenticationUser
loadUserByLogin
(
String
username
,
String
password
)
{
String
[]
data
=
username
.
split
(
"[|]"
);
String
loginname
=
username
;
String
domains
=
""
;
if
(
data
.
length
==
2
)
{
loginname
=
data
[
0
].
trim
();
domains
=
data
[
1
].
trim
();
}
AuthorizationLogin
logininfo
=
new
AuthorizationLogin
();
logininfo
.
setDomain
(
domains
);
logininfo
.
setLoginname
(
loginname
);
logininfo
.
setPassword
(
password
);
AuthenticationUser
user
=
uaaFeignClient
.
login
(
logininfo
);
if
(
user
==
null
){
throw
new
BadRequestAlertException
(
"登录失败"
,
"IBZUAAUser"
,
username
);
}
return
user
;
}
}
src/main/java/cn/ibizlab/util/service/IBZUSERService.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
service
;
import
cn.ibizlab.util.domain.IBZUSER
;
import
com.baomidou.mybatisplus.extension.service.IService
;
/**
* 实体[IBZUSER] 服务对象接口实现
*/
public
interface
IBZUSERService
extends
IService
<
IBZUSER
>
{
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/service/IBZUSERServiceImpl.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
service
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
cn.ibizlab.util.security.AuthenticationUser
;
import
cn.ibizlab.util.errors.BadRequestAlertException
;
import
cn.ibizlab.util.helper.CachedBeanCopier
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.security.core.userdetails.UsernameNotFoundException
;
import
org.springframework.stereotype.Service
;
import
cn.ibizlab.util.mapper.IBZUSERMapper
;
import
cn.ibizlab.util.domain.IBZUSER
;
import
org.springframework.util.DigestUtils
;
import
org.springframework.util.StringUtils
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnExpression
;
import
org.springframework.security.core.authority.AuthorityUtils
;
/**
* 实体[IBZUSER] 服务对象接口实现
*/
@Service
(
"IBZUSERService"
)
@ConditionalOnExpression
(
"(!${ibiz.enablePermissionValid:false})&&'${ibiz.auth.service:IBZUAAUserService}'.equals('IBZUSERService')"
)
public
class
IBZUSERServiceImpl
extends
ServiceImpl
<
IBZUSERMapper
,
IBZUSER
>
implements
IBZUSERService
,
AuthenticationUserService
{
@Value
(
"${ibiz.auth.pwencrymode:0}"
)
private
int
pwencrymode
;
@Override
public
AuthenticationUser
loadUserByUsername
(
String
username
)
{
if
(
StringUtils
.
isEmpty
(
username
))
{
throw
new
UsernameNotFoundException
(
"用户名为空"
);
}
QueryWrapper
<
IBZUSER
>
conds
=
new
QueryWrapper
<
IBZUSER
>();
String
[]
data
=
username
.
split
(
"[|]"
);
String
loginname
=
""
;
String
domains
=
""
;
if
(
data
.
length
>
0
)
{
loginname
=
data
[
0
].
trim
();
}
if
(
data
.
length
>
1
)
{
domains
=
data
[
1
].
trim
();
}
if
(!
StringUtils
.
isEmpty
(
loginname
))
{
conds
.
eq
(
"loginname"
,
loginname
);
}
if
(!
StringUtils
.
isEmpty
(
domains
))
{
conds
.
eq
(
"domains"
,
domains
);
}
IBZUSER
user
=
this
.
getOne
(
conds
);
if
(
user
==
null
)
{
throw
new
UsernameNotFoundException
(
"用户"
+
username
+
"未找到"
);
}
else
{
user
.
setUsername
(
username
);
return
createUserDetails
(
user
);
}
}
@Override
public
AuthenticationUser
loadUserByLogin
(
String
username
,
String
password
){
AuthenticationUser
authuserdetail
=
loadUserByUsername
(
username
);
if
(
pwencrymode
==
1
){
password
=
DigestUtils
.
md5DigestAsHex
(
password
.
getBytes
());
}
else
if
(
pwencrymode
==
2
){
password
=
DigestUtils
.
md5DigestAsHex
(
String
.
format
(
"%1$s||%2$s"
,
username
,
password
).
getBytes
());
}
if
(!
authuserdetail
.
getPassword
().
equals
(
password
))
{
throw
new
BadRequestAlertException
(
"用户名密码错误"
,
"IBZUSER"
,
username
);
}
return
authuserdetail
;
}
public
void
resetByUsername
(
String
username
)
{
}
public
AuthenticationUser
createUserDetails
(
IBZUSER
user
)
{
AuthenticationUser
userdatail
=
new
AuthenticationUser
();
CachedBeanCopier
.
copy
(
user
,
userdatail
);
if
(
userdatail
.
getSuperuser
()
==
1
){
userdatail
.
setAuthorities
(
AuthorityUtils
.
createAuthorityList
(
"ROLE_SUPERADMIN"
));
}
return
userdatail
;
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/service/RemoteService.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
service
;
import
com.alibaba.fastjson.JSONObject
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
feign.*
;
import
feign.codec.Decoder
;
import
feign.codec.Encoder
;
import
org.springframework.beans.factory.ObjectFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.http.HttpMessageConverters
;
import
org.springframework.cloud.openfeign.FeignContext
;
import
org.springframework.cloud.openfeign.support.SpringDecoder
;
import
org.springframework.cloud.openfeign.support.SpringEncoder
;
import
org.springframework.http.converter.HttpMessageConverter
;
import
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
;
import
org.springframework.stereotype.Service
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.Map
;
import
java.util.Objects
;
import
java.util.concurrent.ConcurrentHashMap
;
/**
* 自定义feigen客户端配置
*
* @author
*/
@Service
public
class
RemoteService
{
/**
* FeignClientFactoryBean
*/
@Autowired
protected
FeignContext
feignContext
;
/**
* FeignClient 默认LoadBalancerFeignClient
*/
@Autowired
private
Client
feignClient
;
private
static
final
Map
<
String
,
Object
>
FEIGN_CLIENTS
=
new
ConcurrentHashMap
<>();
/**
* 定义远程通用接口
*/
public
interface
RemoteFeignClient
{
@RequestMapping
(
method
=
RequestMethod
.
POST
,
value
=
"/{path}"
)
JSONObject
post
(
@PathVariable
(
"path"
)
String
path
,
@RequestHeader
(
"Authorization"
)
String
token
,
@RequestBody
Map
param
);
@RequestMapping
(
method
=
RequestMethod
.
GET
,
value
=
"/{path}"
)
JSONObject
request
(
@PathVariable
(
"path"
)
String
path
,
@RequestHeader
(
"Authorization"
)
String
token
,
Map
param
);
@RequestMapping
(
method
=
RequestMethod
.
GET
,
value
=
"/{path}"
)
JSONObject
get
(
@PathVariable
(
"path"
)
String
path
,
@RequestHeader
(
"Authorization"
)
String
token
);
@RequestMapping
(
method
=
RequestMethod
.
PUT
,
value
=
"/{path}"
)
JSONObject
put
(
@PathVariable
(
"path"
)
String
path
,
@RequestHeader
(
"Authorization"
)
String
token
,
@RequestBody
Map
param
);
@RequestMapping
(
method
=
RequestMethod
.
DELETE
,
value
=
"/{path}"
)
JSONObject
delete
(
@PathVariable
(
"path"
)
String
path
,
@RequestHeader
(
"Authorization"
)
String
token
);
}
/**
* @param serverId
* @return
*/
public
RemoteFeignClient
getClient
(
String
serverId
)
{
return
this
.
create
(
RemoteFeignClient
.
class
,
serverId
);
}
/**
* 设置编码解码器为FastJson
*
* @param clazz
* @param serviceId
* @param <T>
* @return
*/
private
synchronized
<
T
>
T
create
(
Class
<
T
>
clazz
,
String
serviceId
)
{
Object
object
=
FEIGN_CLIENTS
.
get
(
serviceId
);
if
(
Objects
.
isNull
(
object
))
{
object
=
Feign
.
builder
()
//decoder指定对象解码方式
.
decoder
(
this
.
feignDecoder
())
.
encoder
(
this
.
feignEncoder
())
.
client
(
feignClient
)
//options方法指定连接超时时长及响应超时时长
.
options
(
new
Request
.
Options
(
5000
,
50000
))
//retryer方法指定重试策略
//.retryer(new Retryer.Default(5000, 5000, 3))
.
contract
(
feignContext
.
getInstance
(
serviceId
,
Contract
.
class
))
//target方法绑定接口与服务端地址。返回类型为绑定的接口类型。
.
target
(
clazz
,
"http://"
+
serviceId
);
FEIGN_CLIENTS
.
put
(
serviceId
,
object
);
}
return
(
T
)
object
;
}
private
Decoder
feignDecoder
()
{
return
new
SpringDecoder
(
feignHttpMessageConverter
());
}
private
Encoder
feignEncoder
()
{
return
new
SpringEncoder
(
feignHttpMessageConverter
());
}
private
ObjectFactory
<
HttpMessageConverters
>
feignHttpMessageConverter
()
{
HttpMessageConverter
jsonConverter
=
new
MappingJackson2HttpMessageConverter
(
new
ObjectMapper
());
final
HttpMessageConverters
httpMessageConverters
=
new
HttpMessageConverters
(
jsonConverter
);
return
()
->
httpMessageConverters
;
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/service/SimpleAuditService.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
service
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
lombok.SneakyThrows
;
import
lombok.extern.slf4j.Slf4j
;
import
cn.ibizlab.util.annotation.Audit
;
import
cn.ibizlab.util.annotation.DEField
;
import
cn.ibizlab.util.domain.EntityBase
;
import
cn.ibizlab.util.domain.IBZDataAudit
;
import
cn.ibizlab.util.helper.DEFieldCacheMap
;
import
cn.ibizlab.util.mapper.IBZDataAuditMapper
;
import
cn.ibizlab.util.security.AuthenticationUser
;
import
org.springframework.expression.EvaluationContext
;
import
org.springframework.expression.Expression
;
import
org.springframework.expression.ExpressionParser
;
import
org.springframework.expression.spel.standard.SpelExpressionParser
;
import
org.springframework.expression.spel.support.StandardEvaluationContext
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.util.StringUtils
;
import
javax.servlet.http.HttpServletRequest
;
import
java.sql.Timestamp
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
/**
* 实体[DataAudit] 服务对象接口实现
*/
@Service
@Slf4j
public
class
SimpleAuditService
extends
ServiceImpl
<
IBZDataAuditMapper
,
IBZDataAudit
>
implements
IBZDataAuditService
{
private
final
ExpressionParser
parser
=
new
SpelExpressionParser
();
private
static
List
cacheMap
=
Collections
.
synchronizedList
(
new
ArrayList
());
/**
* 定时保存审计记录
*/
@Scheduled
(
fixedRate
=
10000
)
public
void
saveAudit
()
{
if
(
cacheMap
.
size
()>
0
)
{
log
.
info
(
String
.
format
(
"正在保存审计数据,当前审计集合数量为[%s]"
,
cacheMap
.
size
()));
List
temp
=
new
ArrayList
();
if
(
cacheMap
.
size
()<
500
)
{
temp
.
addAll
(
cacheMap
);
}
else
{
temp
.
addAll
(
cacheMap
.
subList
(
0
,
500
));
}
this
.
saveBatch
(
temp
);
cacheMap
.
removeAll
(
temp
);
log
.
info
(
String
.
format
(
"保存完成,当前审计集合数量为[%s]"
,
cacheMap
.
size
()));
}
}
/**
* 新建审计日志
* @param request
* @param entity
* @param idValue
* @param auditFields
*/
@Override
public
void
createAudit
(
HttpServletRequest
request
,
EntityBase
entity
,
Object
idValue
,
Map
<
String
,
Audit
>
auditFields
)
{
IBZDataAudit
dataAudit
=
new
IBZDataAudit
();
dataAudit
.
setOppersonid
(
AuthenticationUser
.
getAuthenticationUser
().
getUserid
());
dataAudit
.
setOppersonname
(
String
.
format
(
"%s[%s]"
,
AuthenticationUser
.
getAuthenticationUser
().
getPersonname
(),
AuthenticationUser
.
getAuthenticationUser
().
getOrgname
()));
dataAudit
.
setAudittype
(
"CREATE"
);
dataAudit
.
setAuditobject
(
entity
.
getClass
().
getSimpleName
());
dataAudit
.
setAuditobjectdata
(
idValue
);
dataAudit
.
setOptime
(
new
Timestamp
(
new
Date
().
getTime
()));
if
(
request
!=
null
)
{
dataAudit
.
setIpaddress
(
getIpAddress
(
request
,
AuthenticationUser
.
getAuthenticationUser
()));
}
dataAudit
.
setAuditinfo
(
getAuditInfo
(
entity
,
auditFields
));
dataAudit
.
setIsdatachanged
(
1
);
cacheMap
.
add
(
dataAudit
);
}
/**
* 更新审计日志
* @param request
* @param beforeEntity
* @param serviceObj
* @param idValue
* @param auditFields
*/
@SneakyThrows
public
void
updateAudit
(
HttpServletRequest
request
,
EntityBase
beforeEntity
,
Object
serviceObj
,
Object
idValue
,
Map
<
String
,
Audit
>
auditFields
)
{
//获取更新后的实体
EntityBase
afterEntity
=
getEntity
(
serviceObj
,
idValue
);
//获取更新后的审计内容
String
auditInfo
=
getUpdateAuditInfo
(
beforeEntity
,
afterEntity
,
auditFields
);
//比较更新前后差异内容
int
isDataChanged
=
1
;
//审计内容是否发生变化
if
(
StringUtils
.
isEmpty
(
auditInfo
))
{
isDataChanged
=
0
;
}
IBZDataAudit
dataAudit
=
new
IBZDataAudit
();
dataAudit
.
setOppersonid
(
AuthenticationUser
.
getAuthenticationUser
().
getUserid
());
dataAudit
.
setOppersonname
(
String
.
format
(
"%s[%s]"
,
AuthenticationUser
.
getAuthenticationUser
().
getPersonname
(),
AuthenticationUser
.
getAuthenticationUser
().
getOrgname
()));
dataAudit
.
setAudittype
(
"UPDATE"
);
dataAudit
.
setAuditobject
(
afterEntity
.
getClass
().
getSimpleName
());
dataAudit
.
setAuditobjectdata
(
idValue
);
dataAudit
.
setOptime
(
new
Timestamp
(
new
Date
().
getTime
()));
if
(
request
!=
null
)
{
dataAudit
.
setIpaddress
(
getIpAddress
(
request
,
AuthenticationUser
.
getAuthenticationUser
()));
}
dataAudit
.
setAuditinfo
(
auditInfo
);
dataAudit
.
setIsdatachanged
(
isDataChanged
);
cacheMap
.
add
(
dataAudit
);
}
/**
* 删除审计日志
* @param request
* @param entity
* @param idValue
* @param auditFields
*/
public
void
removeAudit
(
HttpServletRequest
request
,
EntityBase
entity
,
Object
idValue
,
Map
<
String
,
Audit
>
auditFields
)
{
IBZDataAudit
dataAudit
=
new
IBZDataAudit
();
dataAudit
.
setOppersonid
(
AuthenticationUser
.
getAuthenticationUser
().
getUserid
());
dataAudit
.
setOppersonname
(
String
.
format
(
"%s[%s]"
,
AuthenticationUser
.
getAuthenticationUser
().
getPersonname
(),
AuthenticationUser
.
getAuthenticationUser
().
getOrgname
()));
dataAudit
.
setAudittype
(
"REMOVE"
);
dataAudit
.
setAuditobject
(
entity
.
getClass
().
getSimpleName
());
dataAudit
.
setAuditobjectdata
(
idValue
);
dataAudit
.
setOptime
(
new
Timestamp
(
new
Date
().
getTime
()));
if
(
request
!=
null
)
{
dataAudit
.
setIpaddress
(
getIpAddress
(
request
,
AuthenticationUser
.
getAuthenticationUser
()));
}
dataAudit
.
setAuditinfo
(
getAuditInfo
(
entity
,
auditFields
));
dataAudit
.
setIsdatachanged
(
1
);
cacheMap
.
add
(
dataAudit
);
}
private
String
getAuditInfo
(
EntityBase
entity
,
Map
<
String
,
Audit
>
auditFields
)
{
String
auditResult
=
""
;
if
(
auditFields
.
size
()
==
0
)
{
return
auditResult
;
}
Map
<
String
,
DEField
>
deFields
=
DEFieldCacheMap
.
getDEFields
(
entity
.
getClass
());
if
(
deFields
.
size
()
==
0
)
{
return
auditResult
;
}
JSONArray
auditFieldArray
=
new
JSONArray
();
for
(
Map
.
Entry
<
String
,
Audit
>
auditField
:
auditFields
.
entrySet
())
{
Object
objFieldName
=
auditField
.
getKey
();
String
fieldName
=
String
.
valueOf
(
objFieldName
);
DEField
deField
=
null
;
if
(
deFields
.
containsKey
(
fieldName
))
{
deField
=
deFields
.
get
(
fieldName
);
}
if
(
ObjectUtils
.
isEmpty
(
deField
))
{
continue
;
}
Object
value
=
dataTransfer
(
entity
.
get
(
fieldName
),
deField
.
fieldType
(),
deField
.
format
());
if
(!
StringUtils
.
isEmpty
(
value
))
{
JSONObject
auditFieldObj
=
new
JSONObject
();
auditFieldObj
.
put
(
"field"
,
deField
.
value
());
auditFieldObj
.
put
(
"value"
,
value
);
if
(!
StringUtils
.
isEmpty
(
deField
.
dict
()))
{
auditFieldObj
.
put
(
"dict"
,
deField
.
dict
());
}
auditFieldArray
.
add
(
auditFieldObj
);
}
}
if
(
auditFieldArray
.
size
()>
0
)
{
auditResult
=
auditFieldArray
.
toString
();
}
return
auditResult
;
}
/**
* 获取更新审计内容
* @param oldData
* @param newData
* @param auditFields
* @return
*/
private
String
getUpdateAuditInfo
(
EntityBase
oldData
,
EntityBase
newData
,
Map
<
String
,
Audit
>
auditFields
){
String
auditResult
=
""
;
JSONArray
auditFieldArray
=
new
JSONArray
();
if
(
auditFields
.
size
()
==
0
)
{
return
auditResult
;
}
Map
<
String
,
DEField
>
deFields
=
DEFieldCacheMap
.
getDEFields
(
oldData
.
getClass
());
if
(
deFields
.
size
()
==
0
){
return
auditResult
;
}
for
(
Map
.
Entry
<
String
,
Audit
>
auditField
:
auditFields
.
entrySet
())
{
Object
objFieldName
=
auditField
.
getKey
();
//获取注解字段
String
fieldName
=
String
.
valueOf
(
objFieldName
);
//属性名称
DEField
deField
=
null
;
if
(
deFields
.
containsKey
(
fieldName
))
{
deField
=
deFields
.
get
(
fieldName
);
}
if
(
ObjectUtils
.
isEmpty
(
deField
))
{
continue
;
}
Object
oldValue
=
oldData
.
get
(
fieldName
);
//老属性值
Object
newValue
=
newData
.
get
(
fieldName
);
//新属性值
if
(!
compare
(
oldValue
,
newValue
))
{
oldValue
=
dataTransfer
(
oldValue
,
deField
.
fieldType
(),
deField
.
format
());
//属性值转换
newValue
=
dataTransfer
(
newValue
,
deField
.
fieldType
(),
deField
.
format
());
//属性值转换
JSONObject
auditFieldObj
=
new
JSONObject
();
auditFieldObj
.
put
(
"field"
,
deField
.
value
());
auditFieldObj
.
put
(
"beforevalue"
,
oldValue
);
auditFieldObj
.
put
(
"value"
,
newValue
);
if
(!
StringUtils
.
isEmpty
(
deField
.
dict
()))
{
auditFieldObj
.
put
(
"dict"
,
deField
.
dict
());
}
auditFieldArray
.
add
(
auditFieldObj
);
}
}
if
(
auditFieldArray
.
size
()>
0
)
{
auditResult
=
auditFieldArray
.
toString
();
}
return
auditResult
;
}
/**
* 数据转换
* @param value 转换值
* @param dataType 转换字段类型
* @param strFormat 转换字段格式化文本
* @return
*/
private
String
dataTransfer
(
Object
value
,
String
dataType
,
String
strFormat
)
{
if
(
value
==
null
)
{
return
""
;
}
String
transResult
=
value
.
toString
();
if
((
dataType
.
equals
(
"DATE"
)
||
dataType
.
equals
(
"DATETIME"
)
||
dataType
.
equals
(
"TIME"
))
&&
(!
StringUtils
.
isEmpty
(
strFormat
)))
{
//时间类型转换
Timestamp
timestamp
=
(
Timestamp
)
value
;
Date
date
=
timestamp
;
SimpleDateFormat
format
=
new
SimpleDateFormat
(
strFormat
);
transResult
=
format
.
format
(
date
);
}
return
transResult
;
}
/**
* 对象比较
* @param sourceObj 比较源对象
* @param targetObj 比较目标对象
* @return
*/
private
boolean
compare
(
Object
sourceObj
,
Object
targetObj
)
{
if
(
sourceObj
==
null
&&
targetObj
==
null
)
{
return
true
;
}
if
(
sourceObj
==
null
&&
targetObj
!=
null
)
{
return
false
;
}
return
sourceObj
.
equals
(
targetObj
);
}
/**
* 获取实体
* @param service
* @param id
* @return
*/
@SneakyThrows
private
EntityBase
getEntity
(
Object
service
,
Object
id
)
{
EntityBase
entity
=
null
;
if
(!
ObjectUtils
.
isEmpty
(
service
))
{
EvaluationContext
oldContext
=
new
StandardEvaluationContext
();
oldContext
.
setVariable
(
"service"
,
service
);
oldContext
.
setVariable
(
"id"
,
id
);
Expression
oldExp
=
parser
.
parseExpression
(
"#service.get(#id)"
);
return
oldExp
.
getValue
(
oldContext
,
EntityBase
.
class
);
}
return
entity
;
}
/**
* 获取Ip地址
* @param request
* @return
*/
public
String
getIpAddress
(
HttpServletRequest
request
,
AuthenticationUser
authenticationUser
)
{
//客户端有提交ip,以提交的ip为准
if
(
authenticationUser
!=
null
&&
!
StringUtils
.
isEmpty
(
authenticationUser
.
getAddr
()))
{
return
authenticationUser
.
getAddr
();
}
if
(
request
==
null
)
{
return
""
;
}
String
Xip
=
request
.
getHeader
(
"X-Real-IP"
);
String
XFor
=
request
.
getHeader
(
"X-Forwarded-For"
);
if
(!
StringUtils
.
isEmpty
(
XFor
)
&&
!
"unKnown"
.
equalsIgnoreCase
(
XFor
))
{
//多次反向代理后会有多个ip值,第一个ip才是真实ip
int
index
=
XFor
.
indexOf
(
","
);
if
(
index
!=
-
1
){
return
XFor
.
substring
(
0
,
index
);
}
else
{
return
XFor
;
}
}
XFor
=
Xip
;
if
(!
StringUtils
.
isEmpty
(
XFor
)
&&
!
"unKnown"
.
equalsIgnoreCase
(
XFor
))
{
return
XFor
;
}
if
(
StringUtils
.
isEmpty
(
XFor
)
||
"unknown"
.
equalsIgnoreCase
(
XFor
))
{
XFor
=
request
.
getHeader
(
"Proxy-Client-IP"
);
}
if
(
StringUtils
.
isEmpty
(
XFor
)
||
"unknown"
.
equalsIgnoreCase
(
XFor
))
{
XFor
=
request
.
getHeader
(
"WL-Proxy-Client-IP"
);
}
if
(
StringUtils
.
isEmpty
(
XFor
)
||
"unknown"
.
equalsIgnoreCase
(
XFor
))
{
XFor
=
request
.
getHeader
(
"HTTP_CLIENT_IP"
);
}
if
(
StringUtils
.
isEmpty
(
XFor
)
||
"unknown"
.
equalsIgnoreCase
(
XFor
))
{
XFor
=
request
.
getHeader
(
"HTTP_X_FORWARDED_FOR"
);
}
if
(
StringUtils
.
isEmpty
(
XFor
)
||
"unknown"
.
equalsIgnoreCase
(
XFor
))
{
XFor
=
request
.
getRemoteAddr
();
}
return
XFor
;
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/service/SimpleFileService.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
service
;
import
cn.ibizlab.util.domain.FileItem
;
import
cn.ibizlab.util.errors.InternalServerErrorException
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.util.DigestUtils
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.FileCopyUtils
;
import
org.springframework.web.multipart.MultipartFile
;
import
java.io.File
;
import
java.io.IOException
;
import
java.nio.file.Files
;
@Primary
@Slf4j
@Service
public
class
SimpleFileService
implements
FileService
{
@Value
(
"${ibiz.filePath:/app/file/}"
)
private
String
fileRoot
;
@Override
public
FileItem
saveFile
(
MultipartFile
multipartFile
)
{
FileItem
item
=
null
;
// 获取文件名
String
fileName
=
multipartFile
.
getOriginalFilename
();
// 获取文件后缀
String
extname
=
"."
+
getExtensionName
(
fileName
);
try
{
String
fileid
=
DigestUtils
.
md5DigestAsHex
(
multipartFile
.
getInputStream
());
String
fileFullPath
=
this
.
fileRoot
+
"ibizutil"
+
File
.
separator
+
fileid
+
File
.
separator
+
fileName
;
File
file
=
new
File
(
fileFullPath
);
File
parent
=
new
File
(
file
.
getParent
());
if
(!
parent
.
exists
())
{
parent
.
mkdirs
();
}
FileCopyUtils
.
copy
(
multipartFile
.
getInputStream
(),
Files
.
newOutputStream
(
file
.
toPath
()));
item
=
new
FileItem
(
fileid
,
fileName
,
fileid
,
fileName
,
(
int
)
multipartFile
.
getSize
(),
extname
);
}
catch
(
IOException
e
)
{
throw
new
InternalServerErrorException
(
"文件上传失败,"
+
e
);
}
return
item
;
}
@Override
public
File
getFile
(
String
fileid
)
{
String
dirpath
=
this
.
fileRoot
+
"ibizutil"
+
File
.
separator
+
fileid
;
File
parent
=
new
File
(
dirpath
);
if
(
parent
.
exists
()
&&
parent
.
isDirectory
()
&&
parent
.
listFiles
().
length
>
0
)
{
return
parent
.
listFiles
()[
0
];
}
throw
new
InternalServerErrorException
(
"文件未找到"
);
}
/**
* 获取文件扩展名
* @param filename
* @return
*/
public
static
String
getExtensionName
(
String
filename
)
{
if
((
filename
!=
null
)
&&
(
filename
.
length
()
>
0
))
{
int
dot
=
filename
.
lastIndexOf
(
'.'
);
if
((
dot
>-
1
)
&&
(
dot
<
(
filename
.
length
()
-
1
)))
{
return
filename
.
substring
(
dot
+
1
);
}
}
return
filename
;
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/service/SimpleUserService.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
service
;
import
cn.ibizlab.util.security.AuthenticationUser
;
import
cn.ibizlab.util.client.IBZUAAFeignClient
;
import
cn.ibizlab.util.client.IBZOUFeignClient
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.DigestUtils
;
import
org.springframework.util.StringUtils
;
import
com.alibaba.fastjson.JSONObject
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnExpression
;
import
org.springframework.security.core.authority.AuthorityUtils
;
/**
* 实体[IBZUSER] 服务对象接口实现
*/
@Primary
@Service
(
"SimpleUserService"
)
@ConditionalOnExpression
(
"(!${ibiz.enablePermissionValid:false})&&'${ibiz.auth.service:IBZUAAUserService}'.equals('SimpleUserService')"
)
public
class
SimpleUserService
implements
AuthenticationUserService
{
@Override
public
AuthenticationUser
loadUserByUsername
(
String
username
)
{
AuthenticationUser
user
=
new
AuthenticationUser
();
String
[]
data
=
username
.
split
(
"[|]"
);
String
loginname
=
username
;
String
domains
=
""
;
String
password
=
""
;
if
(
data
.
length
==
2
)
{
loginname
=
data
[
0
].
trim
();
domains
=
data
[
1
].
trim
();
}
user
.
setUserid
(
username
);
user
.
setUsercode
(
loginname
);
user
.
setUsername
(
username
);
user
.
setLoginname
(
loginname
);
user
.
setPersonname
(
loginname
);
user
.
setDomain
(
domains
);
user
.
setPassword
(
password
);
user
.
setOrgid
(
domains
);
user
.
setOrgcode
(
domains
);
user
.
setOrgname
(
domains
);
user
.
setSuperuser
(
1
);
user
.
setAuthorities
(
AuthorityUtils
.
createAuthorityList
(
"ROLE_SUPERADMIN"
));
return
user
;
}
@Override
public
AuthenticationUser
loadUserByLogin
(
String
username
,
String
password
)
{
AuthenticationUser
authuserdetail
=
loadUserByUsername
(
username
);
return
authuserdetail
;
}
@Override
public
void
resetByUsername
(
String
username
)
{
}
}
src/main/java/cn/ibizlab/util/web/FeignRequestInterceptor.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
web
;
import
feign.RequestInterceptor
;
import
feign.RequestTemplate
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.util.LinkedMultiValueMap
;
import
org.springframework.util.MultiValueMap
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.web.context.request.RequestContextHolder
;
import
org.springframework.web.context.request.ServletRequestAttributes
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.Enumeration
;
import
java.util.LinkedHashMap
;
/**
* feign请求拦截器
* 拦截所有使用feign发出的请求,附加原始请求Header参数及Token
*/
@Configuration
public
class
FeignRequestInterceptor
implements
RequestInterceptor
{
private
final
Logger
logger
=
LoggerFactory
.
getLogger
(
getClass
());
@Override
public
void
apply
(
RequestTemplate
requestTemplate
)
{
ServletRequestAttributes
requestAttributes
=
(
ServletRequestAttributes
)
RequestContextHolder
.
getRequestAttributes
();
if
(
requestAttributes
!=
null
)
{
HttpServletRequest
request
=
requestAttributes
.
getRequest
();
Enumeration
<
String
>
headerNames
=
request
.
getHeaderNames
();
if
(
headerNames
!=
null
)
{
while
(
headerNames
.
hasMoreElements
())
{
String
name
=
headerNames
.
nextElement
();
if
(
name
.
equalsIgnoreCase
(
"transfer-encoding"
))
{
continue
;
}
String
values
=
request
.
getHeader
(
name
);
requestTemplate
.
header
(
name
,
values
);
}
logger
.
info
(
"feign interceptor header:{}"
,
requestTemplate
);
}
}
}
}
\ No newline at end of file
src/main/java/cn/ibizlab/util/web/IBZOperationParameterReader.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
web
;
import
cn.ibizlab.util.filter.SearchContextBase
;
import
com.fasterxml.classmate.ResolvedType
;
import
com.google.common.base.Predicate
;
import
com.google.common.collect.FluentIterable
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.core.Ordered
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RequestPart
;
import
springfox.documentation.builders.ParameterBuilder
;
import
springfox.documentation.service.Parameter
;
import
springfox.documentation.service.ResolvedMethodParameter
;
import
springfox.documentation.spi.DocumentationType
;
import
springfox.documentation.spi.schema.EnumTypeDeterminer
;
import
springfox.documentation.spi.service.OperationBuilderPlugin
;
import
springfox.documentation.spi.service.contexts.OperationContext
;
import
springfox.documentation.spi.service.contexts.ParameterContext
;
import
springfox.documentation.spring.web.plugins.DocumentationPluginsManager
;
import
springfox.documentation.spring.web.readers.parameter.ExpansionContext
;
import
springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander
;
import
java.lang.annotation.Annotation
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
import
static
com
.
google
.
common
.
base
.
Predicates
.*;
import
static
com
.
google
.
common
.
collect
.
Lists
.*;
import
static
springfox
.
documentation
.
schema
.
Collections
.*;
import
static
springfox
.
documentation
.
schema
.
Maps
.*;
import
static
springfox
.
documentation
.
schema
.
Types
.*;
//@Component
//@Order(Ordered.HIGHEST_PRECEDENCE)
public
class
IBZOperationParameterReader
implements
OperationBuilderPlugin
{
private
final
ModelAttributeParameterExpander
expander
;
private
final
EnumTypeDeterminer
enumTypeDeterminer
;
@Autowired
private
DocumentationPluginsManager
pluginsManager
;
@Autowired
public
IBZOperationParameterReader
(
ModelAttributeParameterExpander
expander
,
EnumTypeDeterminer
enumTypeDeterminer
)
{
this
.
expander
=
expander
;
this
.
enumTypeDeterminer
=
enumTypeDeterminer
;
}
@Override
public
void
apply
(
OperationContext
context
)
{
context
.
operationBuilder
().
parameters
(
context
.
getGlobalOperationParameters
());
context
.
operationBuilder
().
parameters
(
readParameters
(
context
));
}
@Override
public
boolean
supports
(
DocumentationType
delimiter
)
{
return
true
;
}
private
List
<
Parameter
>
readParameters
(
final
OperationContext
context
)
{
List
<
ResolvedMethodParameter
>
methodParameters
=
context
.
getParameters
();
List
<
Parameter
>
parameters
=
newArrayList
();
for
(
ResolvedMethodParameter
methodParameter
:
methodParameters
)
{
ResolvedType
alternate
=
context
.
alternateFor
(
methodParameter
.
getParameterType
());
if
(!
shouldIgnore
(
methodParameter
,
alternate
,
context
.
getIgnorableParameterTypes
()))
{
ParameterContext
parameterContext
=
new
ParameterContext
(
methodParameter
,
new
ParameterBuilder
(),
context
.
getDocumentationContext
(),
context
.
getGenericsNamingStrategy
(),
context
);
if
(
shouldExpand
(
methodParameter
,
alternate
))
{
parameters
.
addAll
(
expander
.
expand
(
new
ExpansionContext
(
""
,
alternate
,
context
)));
}
else
{
parameters
.
add
(
pluginsManager
.
parameter
(
parameterContext
));
}
}
}
return
FluentIterable
.
from
(
parameters
).
filter
(
not
(
hiddenParams
())).
toList
();
}
private
Predicate
<
Parameter
>
hiddenParams
()
{
return
new
Predicate
<
Parameter
>()
{
@Override
public
boolean
apply
(
Parameter
input
)
{
return
input
.
isHidden
();
}
};
}
private
boolean
shouldIgnore
(
final
ResolvedMethodParameter
parameter
,
ResolvedType
resolvedParameterType
,
final
Set
<
Class
>
ignorableParamTypes
)
{
if
(
ignorableParamTypes
.
contains
(
resolvedParameterType
.
getErasedType
()))
{
return
true
;
}
return
FluentIterable
.
from
(
ignorableParamTypes
)
.
filter
(
isAnnotation
())
.
filter
(
parameterIsAnnotatedWithIt
(
parameter
)).
size
()
>
0
;
}
private
Predicate
<
Class
>
parameterIsAnnotatedWithIt
(
final
ResolvedMethodParameter
parameter
)
{
return
new
Predicate
<
Class
>()
{
@Override
public
boolean
apply
(
Class
input
)
{
return
parameter
.
hasParameterAnnotation
(
input
);
}
};
}
private
Predicate
<
Class
>
isAnnotation
()
{
return
new
Predicate
<
Class
>()
{
@Override
public
boolean
apply
(
Class
input
)
{
return
Annotation
.
class
.
isAssignableFrom
(
input
);
}
};
}
private
boolean
shouldExpand
(
final
ResolvedMethodParameter
parameter
,
ResolvedType
resolvedParamType
)
{
return
!
parameter
.
hasParameterAnnotation
(
RequestBody
.
class
)
&&
!
parameter
.
hasParameterAnnotation
(
RequestPart
.
class
)
&&
!
parameter
.
hasParameterAnnotation
(
RequestParam
.
class
)
&&
!
parameter
.
hasParameterAnnotation
(
PathVariable
.
class
)
&&
!
isBaseType
(
typeNameFor
(
resolvedParamType
.
getErasedType
()))
&&
!
enumTypeDeterminer
.
isEnum
(
resolvedParamType
.
getErasedType
())
&&
!
isContainerType
(
resolvedParamType
)
&&
!
isMapType
(
resolvedParamType
)
&&
!
SearchContextBase
.
class
.
isAssignableFrom
(
resolvedParamType
.
getErasedType
());
}
}
src/main/java/cn/ibizlab/util/web/SearchContextHandlerMethodArgumentResolver.java
0 → 100644
浏览文件 @
a6bfca56
package
cn
.
ibizlab
.
util
.
web
;
import
cn.ibizlab.util.filter.SearchContextBase
;
import
cn.ibizlab.util.domain.DTOBase
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.core.MethodParameter
;
import
org.springframework.web.bind.support.WebDataBinderFactory
;
import
org.springframework.web.context.request.NativeWebRequest
;
import
org.springframework.web.method.support.HandlerMethodArgumentResolver
;
import
org.springframework.web.method.support.ModelAndViewContainer
;
import
java.util.LinkedHashMap
;
import
java.util.Map
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.annotation.Configuration
;
@Slf4j
@Configuration
public
class
SearchContextHandlerMethodArgumentResolver
implements
HandlerMethodArgumentResolver
{
@Value
(
"${ibiz.pageLimit:1000}"
)
private
int
pageLimit
=
1000
;
private
static
ObjectMapper
objectMapper
=
new
ObjectMapper
();
@Override
public
boolean
supportsParameter
(
MethodParameter
parameter
)
{
return
SearchContextBase
.
class
.
isAssignableFrom
(
parameter
.
getParameterType
())
||
DTOBase
.
class
.
isAssignableFrom
(
parameter
.
getParameterType
());
}
@Override
public
Object
resolveArgument
(
MethodParameter
parameter
,
ModelAndViewContainer
mavContainer
,
NativeWebRequest
webRequest
,
WebDataBinderFactory
binderFactory
)
throws
Exception
{
Map
<
String
,
String
[]>
params
=
webRequest
.
getParameterMap
();
LinkedHashMap
<
String
,
Object
>
set
=
new
LinkedHashMap
<>();
for
(
String
key
:
params
.
keySet
())
{
set
.
put
(
key
,
params
.
get
(
key
)[
0
]);
}
if
(
SearchContextBase
.
class
.
isAssignableFrom
(
parameter
.
getParameterType
())
&&
(!
set
.
containsKey
(
"size"
))){
set
.
put
(
"size"
,
pageLimit
);
}
String
json
=
objectMapper
.
writeValueAsString
(
set
);
return
objectMapper
.
readValue
(
json
,
parameter
.
getParameterType
());
}
}
\ No newline at end of file
src/main/resources/application-eureka.yml
0 → 100644
浏览文件 @
a6bfca56
#eureka配置中心
spring
:
cloud
:
nacos
:
discovery
:
enabled
:
false
eureka
:
client
:
enabled
:
true
serviceUrl
:
defaultZone
:
http://127.0.0.1:8762/eureka/
src/main/resources/application-nacos.yml
0 → 100644
浏览文件 @
a6bfca56
#nacos配置中心
spring
:
cloud
:
nacos
:
discovery
:
server-addr
:
127.0.0.1:8848
enabled
:
true
eureka
:
client
:
enabled
:
false
src/main/resources/application-sys.yml
0 → 100644
浏览文件 @
a6bfca56
#缓存、数据源
spring
:
cache
:
redis
:
time-to-live
:
3600
caffeine
:
spec
:
initialCapacity=5,maximumSize=500,expireAfterWrite=3600s
redis
:
host
:
127.0.0.1
port
:
6379
password
:
database
:
0
lettuce
:
pool
:
max-active
:
32
max-wait
:
300ms
max-idle
:
16
min-idle
:
8
servlet
:
multipart
:
max-file-size
:
100MB
max-request-size
:
100MB
datasource
:
username
:
root
password
:
root
url
:
jdbc:mysql://127.0.0.1:3306/a_A_5d9d78509?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&allowMultiQueries=true
driver-class-name
:
com.mysql.jdbc.Driver
isSyncDBSchema
:
false
defaultSchema
:
a_A_5d9d78509
dynamic
:
druid
:
#以下是全局默认值,可以全局更改
filters
:
stat,log4j2
#配置初始化大小/最小/最大
initial-size
:
1
min-idle
:
1
max-active
:
20
#获取连接等待超时时间
max-wait
:
60000
#间隔多久进行一次检测,检测需要关闭的空闲连接
time-between-eviction-runs-millis
:
60000
#一个连接在池中最小生存的时间
min-evictable-idle-time-millis
:
300000
validation-query
:
SELECT 1 FROM DUAL
test-while-idle
:
true
test-on-borrow
:
false
test-on-return
:
false
#打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
pool-prepared-statements
:
false
max-pool-prepared-statement-per-connection-size
:
20
datasource
:
master
:
username
:
${spring.datasource.username}
password
:
${spring.datasource.password}
url
:
${spring.datasource.url}
driver-class-name
:
${spring.datasource.driver-class-name}
conf
:
classpath:liquibase/master.xml
isSyncDBSchema
:
${spring.datasource.isSyncDBSchema}
defaultSchema
:
${spring.datasource.defaultSchema}
db2
:
username
:
${spring.datasource.username}
password
:
${spring.datasource.password}
url
:
${spring.datasource.url}
driver-class-name
:
${spring.datasource.driver-class-name}
conf
:
classpath:liquibase/master.xml
isSyncDBSchema
:
${spring.datasource.isSyncDBSchema}
defaultSchema
:
${spring.datasource.defaultSchema}
#Mybatis-plus配置
mybatis-plus
:
global-config
:
refresh-mapper
:
true
db-config
:
# 全局逻辑已删除默认值
logic-delete-value
:
0
# 全局逻辑未删除默认值
logic-not-delete-value
:
1
mapper-locations
:
classpath*:/mapper/*/*/*.xml
configuration
:
jdbc-type-for-null
:
'
null'
map-underscore-to-camel-case
:
false
#阿里sentinel熔断器
feign
:
httpclient
:
enabled
:
true
sentinel
:
enabled
:
true
compression
:
request
:
enabled
:
true
mime-types
:
application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain
min-response-size
:
10240
response
:
enabled
:
true
#Log配置
logging
:
level
:
cn.ibizlab
:
debug
org.springframework.boot.autoconfigure
:
ERROR
#zuul网关超时设置
ribbon
:
ReadTimeout
:
60000
ConnectTimeout
:
60000
#系统是否开启权限验证、是否开启缓存
#缓存级别:无缓存(无配置项)、一级缓存(L1)、二级缓存(L2)
ibiz
:
enablePermissionValid
:
true
cacheLevel
:
L1
#(L1)一级本地caffeine缓存;(L2)caffeine缓存+Redis缓存
### jobs
jobs
:
#admin-address: http://127.0.0.1:40005
app-name
:
ibznotify
app-port
:
9999
#app-ip: 127.0.0.1
### 启用Gzip压缩
server
:
compression
:
enabled
:
true
mime-types
:
application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain
min-response-size
:
10240
编辑
预览
Markdown
格式
0%
请重试
or
添加新附件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
先完成此消息的编辑!
取消
想要评论请
注册
或
登录