├── .flattened-pom.xml ├── .gitignore ├── LICENSE ├── README.md ├── lombok.config ├── pom.xml ├── sika-code-batch ├── .flattened-pom.xml ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── sika │ └── code │ └── batch │ ├── core │ ├── builder │ │ ├── BaseItemProcessorBuilder.java │ │ ├── BaseItemReaderBuilder.java │ │ └── BaseItemWriterBuilder.java │ ├── context │ │ └── BaseBatchContext.java │ ├── entity │ │ └── BaseBatchEntity.java │ ├── factory │ │ └── BatchFactory.java │ ├── item │ │ ├── processor │ │ │ └── BaseProcessor.java │ │ ├── reader │ │ │ └── BaseReader.java │ │ └── writer │ │ │ ├── BaseWriterExecutor.java │ │ │ └── MultiResourceItemWriterSupport.java │ └── listener │ │ ├── BaseItemProcessListener.java │ │ ├── BaseItemReadListener.java │ │ ├── BaseItemWriteListener.java │ │ ├── BaseJobExecutionListener.java │ │ └── BaseStepExecutionListener.java │ └── standard │ ├── bean │ ├── common │ │ ├── BatchBean.java │ │ ├── ItemBean.java │ │ ├── ItemProcessorBean.java │ │ ├── ItemReaderBean.java │ │ └── ItemWriterBean.java │ ├── processor │ │ ├── BaseProcessorBean.java │ │ └── StandProcessorBean.java │ ├── reader │ │ ├── BaseReaderBean.java │ │ ├── FlatReaderBean.java │ │ ├── JdbcReaderBean.java │ │ ├── MethodReaderBean.java │ │ └── RestReaderBean.java │ └── writer │ │ ├── BaseWriterBean.java │ │ ├── FlatWriterBean.java │ │ ├── JdbcWriterBean.java │ │ ├── MethodWriterBean.java │ │ ├── RedisWriterBean.java │ │ └── RestWriterBean.java │ ├── builder │ ├── item │ │ ├── processor │ │ │ └── StandardProcessorBuilder.java │ │ ├── reader │ │ │ ├── StandardFlatItemReaderBuilder.java │ │ │ ├── StandardJdbcCursorItemReaderBuilder.java │ │ │ ├── StandardJdbcPagingItemReaderBuilder.java │ │ │ ├── StandardMethodItemReaderBuilder.java │ │ │ └── StandardRestItemReaderBuilder.java │ │ └── writer │ │ │ ├── StandardFlatItemWriterBuilder.java │ │ │ ├── StandardJdbcBatchItemWriterBuilder.java │ │ │ ├── StandardMethodItemWriterBuilder.java │ │ │ ├── StandardMultiResourceItemWriterBuilder.java │ │ │ ├── StandardRedisBatchItemWriterBuilder.java │ │ │ └── StandardRestItemWriterBuilder.java │ └── writerdata │ │ ├── BaseWriterDataBuilder.java │ │ └── DefaultWriterDataBuilder.java │ ├── command │ └── BatchCommander.java │ ├── config │ ├── InmemoryJobConfig.java │ └── JSONBeanWrapperFieldSetMapper.java │ ├── constant │ ├── BatchConstant.java │ └── RedisStoreTypeEnum.java │ ├── context │ ├── StandardContext.java │ └── StandardParamContext.java │ ├── entity │ └── StandardBatchEntity.java │ ├── item │ ├── processor │ │ └── StandardProcessor.java │ ├── reader │ │ ├── MethodReaderItemSupport.java │ │ ├── RestReaderItemSupport.java │ │ └── StandardReader.java │ └── writer │ │ ├── FlatFileItemWriterSupport.java │ │ ├── JdbcBatchItemWriterSupport.java │ │ ├── MethodWriterItemSupport.java │ │ ├── RedisBatchItemWriterSupport.java │ │ ├── RestWriterItemSupport.java │ │ └── StandardWriterExecutor.java │ ├── listener │ ├── StandChunkListener.java │ ├── StandardJobExecutionListener.java │ ├── StandardStepExecutionListener.java │ ├── StandardStepProcessListener.java │ ├── StandardStepReadListener.java │ └── StandardStepWriteListener.java │ ├── store │ ├── StandardMapExecutionContextDao.java │ ├── StandardMapJobExecutionDao.java │ ├── StandardMapJobInstanceDao.java │ ├── StandardMapJobRepositoryFactoryBean.java │ ├── StandardMapStepExecutionDao.java │ └── bean │ │ └── StandardJobInstance.java │ └── util │ └── BatchUtil.java ├── sika-code-cache ├── .flattened-pom.xml ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── sika │ └── code │ └── cache │ ├── constant │ └── CacheConstant.java │ ├── executor │ ├── LocalCacheDefaultExecutor.java │ ├── LocalCacheExecutor.java │ ├── RedisCacheDefaultExecutor.java │ └── RedisCacheExecutor.java │ ├── manager │ └── CacheManager.java │ └── pojo │ ├── CacheDTO.java │ ├── ClearCacheDTO.java │ ├── ClearLocalCacheDTO.java │ ├── ClearRedisCacheDTO.java │ ├── GetCacheDTO.java │ ├── GetLocalCacheDTO.java │ └── GetRedisCacheDTO.java ├── sika-code-core ├── .flattened-pom.xml ├── pom.xml └── src │ ├── main │ └── java │ │ └── com │ │ └── sika │ │ └── code │ │ └── core │ │ ├── base │ │ ├── application │ │ │ └── BaseApplication.java │ │ ├── constant │ │ │ ├── BaseCodeEnum.java │ │ │ ├── BaseComponentScan.java │ │ │ ├── BaseConstant.java │ │ │ ├── BaseTypeEnum.java │ │ │ └── PropertiesConstant.java │ │ ├── convert │ │ │ └── BaseConverter.java │ │ ├── errorcode │ │ │ ├── BaseErrorCode.java │ │ │ └── BaseErrorCodeEnum.java │ │ ├── pojo │ │ │ ├── BasePoJo.java │ │ │ ├── command │ │ │ │ └── BaseCommand.java │ │ │ ├── context │ │ │ │ └── BaseContext.java │ │ │ ├── domain │ │ │ │ ├── entity │ │ │ │ │ ├── BaseEntity.java │ │ │ │ │ ├── BaseEntityImpl.java │ │ │ │ │ └── BaseStandardEntity.java │ │ │ │ ├── factory │ │ │ │ │ ├── BaseFactory.java │ │ │ │ │ └── MetaSpringUtil.java │ │ │ │ └── valueobject │ │ │ │ │ └── BaseValueObject.java │ │ │ ├── dto │ │ │ │ ├── BaseDTO.java │ │ │ │ ├── BaseMsgDTO.java │ │ │ │ └── ServiceResult.java │ │ │ ├── po │ │ │ │ └── BasePO.java │ │ │ ├── query │ │ │ │ ├── BaseQuery.java │ │ │ │ ├── Page.java │ │ │ │ ├── PageQuery.java │ │ │ │ └── SortType.java │ │ │ └── vo │ │ │ │ └── BaseVO.java │ │ ├── repository │ │ │ └── BaseRepository.java │ │ ├── service │ │ │ ├── BaseService.java │ │ │ └── BaseServiceImpl.java │ │ ├── test │ │ │ ├── BaseTest.java │ │ │ ├── BaseTestController.java │ │ │ ├── BaseTestEntity.java │ │ │ ├── BaseTestRepository.java │ │ │ └── BaseTestService.java │ │ └── util │ │ │ ├── JSONUtil.java │ │ │ └── ScReflectUtil.java │ │ ├── exception │ │ ├── BusinessException.java │ │ ├── advice │ │ │ └── ExceptionAdvice.java │ │ ├── config │ │ │ └── ExceptionConfig.java │ │ ├── dto │ │ │ └── BaseBusinessExceptionDTO.java │ │ └── properties │ │ │ └── ExceptionProperties.java │ │ ├── informer │ │ ├── BaseInformer.java │ │ ├── config │ │ │ └── InformerConfig.java │ │ ├── constant │ │ │ └── MsgTypeEnum.java │ │ ├── dto │ │ │ └── BaseThirdMessageDTO.java │ │ ├── impl │ │ │ └── InformerForLog.java │ │ ├── properties │ │ │ └── InformerProperties.java │ │ └── util │ │ │ └── InformerUtil.java │ │ ├── log │ │ ├── config │ │ │ └── TraceIdGenerator.java │ │ └── util │ │ │ └── LogUtil.java │ │ ├── result │ │ ├── Result.java │ │ ├── config │ │ │ └── ResultConfig.java │ │ └── generator │ │ │ └── ResultGenerator.java │ │ └── util │ │ ├── BeanUtil.java │ │ ├── EnumUtil.java │ │ └── IdUtil.java │ └── test │ └── java │ └── test.txt ├── sika-code-db-sharding ├── .flattened-pom.xml ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── sika │ │ └── code │ │ └── db │ │ └── sharding │ │ ├── annotation │ │ └── ShardingRule.java │ │ ├── config │ │ ├── ShardingConfigure.java │ │ └── ShardingRuleConfig.java │ │ ├── context │ │ └── ShardingContext.java │ │ ├── executor │ │ ├── DefaultShardingExecutor.java │ │ └── ShardingExecutor.java │ │ ├── generator │ │ ├── builder │ │ │ └── SqlGeneratorBuilder.java │ │ ├── dto │ │ │ └── SqlGeneratorDTO.java │ │ └── executor │ │ │ └── SqlGeneratorExecutor.java │ │ ├── manager │ │ └── ShardingStrategyManager.java │ │ ├── plugin │ │ └── ShardingInterceptor.java │ │ ├── repository │ │ └── BaseShardingRepository.java │ │ ├── strategy │ │ ├── Strategy.java │ │ ├── xxyy │ │ │ ├── BaseXxYyStrategy.java │ │ │ ├── EightDbEightTableStrategy.java │ │ │ ├── SixteenDbSixteenTableStrategy.java │ │ │ └── ThirtyTwoDbThirtyTwoTableStrategy.java │ │ └── year │ │ │ ├── BaseYearXxStrategy.java │ │ │ ├── YearDayStrategy.java │ │ │ ├── YearMonthStrategy.java │ │ │ └── YearSevenDayStrategy.java │ │ └── util │ │ └── ShardingUtil.java │ └── resources │ └── db │ ├── create_db_demo.sql │ └── create_table_demo.sql ├── sika-code-db ├── .flattened-pom.xml ├── pom.xml └── src │ ├── main │ └── java │ │ └── com │ │ └── sika │ │ └── code │ │ └── db │ │ ├── constant │ │ └── DbConstant.java │ │ ├── injector │ │ ├── config │ │ │ ├── CustomizedSqlInjector.java │ │ │ └── MyBatisPlusConfig.java │ │ └── method │ │ │ ├── LogicDeleteMethod.java │ │ │ └── UpdateBatchMethod.java │ │ ├── mapper │ │ └── BaseMapper.java │ │ ├── po │ │ ├── BasePoAuto.java │ │ └── BasePoNone.java │ │ └── repository │ │ ├── BaseRepositoryMybatisPlus.java │ │ └── impl │ │ └── BaseRepositoryMyBatisPlusImpl.java │ └── test │ └── java │ └── test.txt ├── sika-code-generator ├── .flattened-pom.xml ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── sika │ │ │ └── code │ │ │ └── generator │ │ │ ├── GeneratorCommander.java │ │ │ ├── GeneratorExecutor.java │ │ │ ├── constant │ │ │ └── GenerratorClassEnum.java │ │ │ └── dto │ │ │ ├── GeneratorClientDTO.java │ │ │ └── GeneratorDTO.java │ └── resources │ │ ├── log4j2-spring.xml │ │ ├── logback.xml │ │ └── template │ │ ├── aggregateRoot.java.ftl │ │ ├── apiService.java.ftl │ │ ├── apiServiceImpl.java.ftl │ │ ├── command.java.ftl │ │ ├── context.java.ftl │ │ ├── controller.java.ftl │ │ ├── controller.test.java.ftl │ │ ├── converter.java.ftl │ │ ├── dto.java.ftl │ │ ├── entity.java.ftl │ │ ├── entity.test.java.ftl │ │ ├── factory.java.ftl │ │ ├── mapper.java.ftl │ │ ├── mapper.xml.ftl │ │ ├── po.java.ftl │ │ ├── query.java.ftl │ │ ├── repository.java.ftl │ │ ├── repository.test.java.ftl │ │ ├── repositoryImpl.java.ftl │ │ ├── rpc.java.ftl │ │ ├── service.java.ftl │ │ ├── service.test.java.ftl │ │ ├── serviceImpl.java.ftl │ │ └── valueObject.java.ftl │ └── test │ └── java │ └── test.txt ├── sika-code-job ├── .flattened-pom.xml ├── README.md ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── ak │ │ │ └── cloud │ │ │ └── standard │ │ │ └── frame │ │ │ └── job │ │ │ └── base │ │ │ ├── context │ │ │ └── BaseJobContext.java │ │ │ ├── executor │ │ │ └── BaseJobExecutor.java │ │ │ └── task │ │ │ └── BaseJobTask.java │ └── resources │ │ └── test.txt │ └── test │ └── java │ └── test.txt └── sika-code-migrate ├── .flattened-pom.xml ├── pom.xml └── src └── main └── java └── com └── sika └── code └── migrate ├── builder ├── MigrateForestRequestBuilder.java ├── MigrateRequestRuleBuilder.java └── MigrateRuleResponseBuilder.java ├── constant ├── MigrateConstant.java └── MigrateTypeEnum.java ├── executor ├── MigrateRequestExecutor.java └── MigrateResultExecutor.java ├── interceptor ├── MigrateInterceptor.java └── MigrateResponseBodyWrite.java ├── pojo ├── MigrateResultDTO.java ├── MigrateRuleRequest.java ├── MigrateRuleResponse.java └── MigrateRuleResult.java ├── rule └── MigrateRequestRule.java └── util └── SpringMVCUtil.java /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *.class 3 | *.iml 4 | 5 | # Mobile Tools for Java (J2ME) 6 | .mtj.tmp/ 7 | 8 | # Package Files # 9 | *.jar 10 | *.war 11 | *.ear 12 | .settings 13 | .settings/* 14 | .classpath 15 | .project 16 | target 17 | target/* 18 | classes 19 | classes/* 20 | */node_modules/* 21 | node_modules/* 22 | 23 | rebel.xml 24 | 25 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 26 | hs_err_pid* 27 | logs 28 | logs/* 29 | 30 | *.rebel-remote.xml 31 | *.rebel-remote.xml.bak 32 | *.rebel.xml.bak 33 | *Mine_* 34 | .history 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 sika-code 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /lombok.config: -------------------------------------------------------------------------------- 1 | lombok.equalsAndHashCode.callSuper = call -------------------------------------------------------------------------------- /sika-code-batch/.flattened-pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | io.github.sika-code-cloud 7 | sika-code 8 | 3.1.2 9 | 10 | io.github.sika-code-cloud 11 | sika-code-batch 12 | 3.1.2 13 | 14 | 15 | MIT License 16 | http://www.opensource.org/licenses/mit-license.php 17 | 18 | 19 | 20 | 8 21 | 8 22 | 23 | 24 | 25 | io.github.sika-code-cloud 26 | sika-code-core 27 | ${revision} 28 | 29 | 30 | org.springframework.boot 31 | spring-boot-starter-batch 32 | 33 | 34 | org.springframework.boot 35 | spring-boot-starter-data-redis 36 | provided 37 | 38 | 39 | com.dtflys.forest 40 | forest-spring-boot-starter 41 | ${forest.version} 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /sika-code-batch/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | sika-code 7 | io.github.sika-code-cloud 8 | ${revision} 9 | 10 | 4.0.0 11 | 12 | sika-code-batch 13 | 14 | 15 | 8 16 | 8 17 | 18 | 19 | 20 | io.github.sika-code-cloud 21 | sika-code-core 22 | ${revision} 23 | 24 | 25 | 26 | org.springframework.boot 27 | spring-boot-starter-batch 28 | 29 | 30 | org.springframework.boot 31 | spring-boot-starter-data-redis 32 | provided 33 | 34 | 35 | com.dtflys.forest 36 | forest-spring-boot-starter 37 | ${forest.version} 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/core/builder/BaseItemProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.core.builder; 2 | 3 | import com.sika.code.batch.standard.bean.common.BatchBean; 4 | import org.springframework.batch.item.ItemProcessor; 5 | 6 | /** 7 | *

8 | * 基础写构建起 9 | *

10 | * 11 | * @author by sikadai 12 | * @version 1.0 13 | * @since 2022/6/3 17:52 14 | */ 15 | public interface BaseItemProcessorBuilder { 16 | ItemProcessor build(BatchBean batchBean); 17 | } 18 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/core/builder/BaseItemReaderBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.core.builder; 2 | 3 | import com.sika.code.batch.standard.bean.common.BatchBean; 4 | import org.springframework.batch.item.ItemReader; 5 | 6 | /** 7 | *

8 | * 基础写构建起 9 | *

10 | * 11 | * @author by sikadai 12 | * @version 1.0 13 | * @since 2022/6/3 17:52 14 | */ 15 | public interface BaseItemReaderBuilder { 16 | ItemReader build(BatchBean batchBean); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/core/builder/BaseItemWriterBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.core.builder; 2 | 3 | import com.sika.code.batch.standard.bean.common.BatchBean; 4 | import org.springframework.batch.item.ItemWriter; 5 | 6 | /** 7 | *

8 | * 基础写构建起 9 | *

10 | * 11 | * @author by sikadai 12 | * @version 1.0 13 | * @since 2022/6/3 17:52 14 | */ 15 | public interface BaseItemWriterBuilder { 16 | ItemWriter build(BatchBean batchBean); 17 | } 18 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/core/context/BaseBatchContext.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.core.context; 2 | 3 | import com.sika.code.core.base.pojo.context.BaseContext; 4 | import lombok.Data; 5 | 6 | /** 7 | *

8 | * 基础批处理上下文 9 | *

10 | * 11 | * @author by sikadai 12 | * @version 1.0 13 | * @since 2022/6/3 12:58 14 | */ 15 | @Data 16 | public abstract class BaseBatchContext implements BaseContext { 17 | 18 | } 19 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/core/entity/BaseBatchEntity.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.core.entity; 2 | 3 | import com.sika.code.core.base.pojo.domain.entity.BaseStandardEntity; 4 | import com.sika.code.batch.core.context.BaseBatchContext; 5 | 6 | /** 7 | *

8 | * 基础批处理实体 9 | *

10 | * 11 | * @author by sikadai 12 | * @version 1.0 13 | * @since 2022/6/3 12:57 14 | */ 15 | public abstract class BaseBatchEntity extends BaseStandardEntity { 16 | 17 | } 18 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/core/item/processor/BaseProcessor.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.core.item.processor; 2 | 3 | import com.sika.code.batch.standard.bean.common.BatchBean; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.batch.item.ItemProcessor; 8 | 9 | /** 10 | *

11 | * 基础处理器 12 | *

13 | * 14 | * @author by sikadai 15 | * @version 1.0 16 | * @since 2022/6/3 12:53 17 | */ 18 | @Slf4j 19 | @Data 20 | @Accessors(chain = true) 21 | public abstract class BaseProcessor implements ItemProcessor { 22 | protected BatchBean batchBean; 23 | 24 | 25 | } -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/core/item/reader/BaseReader.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.core.item.reader; 2 | 3 | 4 | import com.sika.code.batch.standard.bean.common.BatchBean; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | import org.springframework.batch.item.*; 8 | import org.springframework.beans.factory.InitializingBean; 9 | import org.springframework.util.Assert; 10 | 11 | /** 12 | *

13 | * 基础读取器 14 | *

15 | * 16 | * @author by sikadai 17 | * @version 1.0 18 | * @since 2022/6/3 12:53 19 | */ 20 | @Setter 21 | @Getter 22 | public class BaseReader implements ItemStreamReader, InitializingBean { 23 | protected BatchBean batchBean; 24 | protected ItemReader itemReader; 25 | 26 | @Override 27 | public I read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { 28 | return itemReader.read(); 29 | } 30 | 31 | @Override 32 | public void afterPropertiesSet() throws Exception { 33 | Assert.notNull(batchBean, "The batchBean may not be null"); 34 | Assert.notNull(itemReader, "The 'itemReader' may not be null"); 35 | } 36 | 37 | @Override 38 | public void close() throws ItemStreamException { 39 | if (itemReader instanceof ItemStream) { 40 | ((ItemStream) itemReader).close(); 41 | } 42 | } 43 | 44 | @Override 45 | public void open(ExecutionContext executionContext) throws ItemStreamException { 46 | if (itemReader instanceof ItemStream) { 47 | ((ItemStream) itemReader).open(executionContext); 48 | } 49 | } 50 | 51 | @Override 52 | public void update(ExecutionContext executionContext) throws ItemStreamException { 53 | if (itemReader instanceof ItemStream) { 54 | ((ItemStream) itemReader).update(executionContext); 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/core/item/writer/MultiResourceItemWriterSupport.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.core.item.writer; 2 | 3 | import cn.hutool.core.collection.CollUtil; 4 | import com.google.common.collect.Lists; 5 | import lombok.Data; 6 | import org.springframework.batch.item.file.MultiResourceItemWriter; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | *

12 | * 13 | *

14 | * 15 | * @author by sikadai 16 | * @version 1.0 17 | * @since 2022/5/29 20:28 18 | */ 19 | @Data 20 | public class MultiResourceItemWriterSupport extends MultiResourceItemWriter { 21 | 22 | private int currentResourceItemCountTemp = 0; 23 | 24 | private int itemCountLimitPerResource = Integer.MAX_VALUE; 25 | 26 | @Override 27 | public void write(List items) throws Exception { 28 | List list = Lists.newArrayList(); 29 | for (T t : items) { 30 | currentResourceItemCountTemp++; 31 | list.add(t); 32 | if (currentResourceItemCountTemp == itemCountLimitPerResource) { 33 | super.write(list); 34 | currentResourceItemCountTemp = 0; 35 | list.clear(); 36 | } 37 | } 38 | if (CollUtil.isNotEmpty(list)) { 39 | super.write(list); 40 | } 41 | } 42 | 43 | @Override 44 | public void setItemCountLimitPerResource(int itemCountLimitPerResource) { 45 | this.itemCountLimitPerResource = itemCountLimitPerResource; 46 | super.setItemCountLimitPerResource(itemCountLimitPerResource); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/core/listener/BaseItemProcessListener.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.core.listener; 2 | 3 | import org.springframework.batch.core.ItemProcessListener; 4 | 5 | public interface BaseItemProcessListener extends ItemProcessListener { 6 | @Override 7 | default void beforeProcess(T t) { 8 | 9 | } 10 | 11 | @Override 12 | default void afterProcess(T t, S s) { 13 | 14 | } 15 | 16 | @Override 17 | default void onProcessError(T t, Exception e) { 18 | 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/core/listener/BaseItemReadListener.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.core.listener; 2 | 3 | import org.springframework.batch.core.ItemReadListener; 4 | 5 | 6 | public interface BaseItemReadListener extends ItemReadListener { 7 | @Override 8 | default void beforeRead() { 9 | 10 | } 11 | 12 | @Override 13 | default void afterRead(T t) { 14 | 15 | } 16 | 17 | @Override 18 | default void onReadError(Exception e) { 19 | 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/core/listener/BaseItemWriteListener.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.core.listener; 2 | 3 | 4 | import org.springframework.batch.core.ItemWriteListener; 5 | 6 | import java.util.List; 7 | 8 | public interface BaseItemWriteListener extends ItemWriteListener { 9 | 10 | @Override 11 | default void beforeWrite(List list) { 12 | 13 | } 14 | 15 | @Override 16 | default void afterWrite(List list) { 17 | } 18 | 19 | @Override 20 | default void onWriteError(Exception e, List list) { 21 | 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/core/listener/BaseJobExecutionListener.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.core.listener; 2 | 3 | import org.springframework.batch.core.JobExecution; 4 | import org.springframework.batch.core.JobExecutionListener; 5 | 6 | /** 7 | *

8 | * 基础Job执行器监听器 9 | *

10 | * 11 | * @author by sikadai 12 | * @version 1.0 13 | * @since 2022/6/4 10:07 14 | */ 15 | public interface BaseJobExecutionListener extends JobExecutionListener { 16 | @Override 17 | default void beforeJob(JobExecution jobExecution) { 18 | 19 | } 20 | 21 | @Override 22 | default void afterJob(JobExecution jobExecution) { 23 | 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/core/listener/BaseStepExecutionListener.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.core.listener; 2 | 3 | import org.springframework.batch.core.ExitStatus; 4 | import org.springframework.batch.core.StepExecution; 5 | import org.springframework.batch.core.StepExecutionListener; 6 | 7 | /** 8 | *

9 | * 基础Step执行器监听器 10 | *

11 | * 12 | * @author by sikadai 13 | * @version 1.0 14 | * @since 2022/6/4 10:07 15 | */ 16 | public interface BaseStepExecutionListener extends StepExecutionListener { 17 | @Override 18 | default void beforeStep(StepExecution stepExecution) { 19 | 20 | } 21 | 22 | @Override 23 | default ExitStatus afterStep(StepExecution stepExecution) { 24 | return null; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/common/BatchBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.common; 2 | 3 | import com.sika.code.batch.standard.bean.processor.StandProcessorBean; 4 | import lombok.Data; 5 | 6 | import java.util.*; 7 | 8 | /** 9 | *

10 | * 批处理的入口Bean 11 | *

12 | * 13 | * @author by sikadai 14 | * @version 1.0 15 | * @since 2022/5/29 15:40 16 | */ 17 | @Data 18 | public class BatchBean { 19 | 20 | private String jobName; 21 | private String stepName; 22 | private Integer skipLimit; 23 | private Integer chunk = 10000; 24 | // 是否开启多写源异步写、当不为空的时候为异步写、为空为同步写 25 | private Integer asynWrite; 26 | 27 | private ItemReaderBean itemReaderBean; 28 | private ItemProcessorBean itemProcessorBean; 29 | private List> itemWriterBeans; 30 | 31 | private ItemWriterBean currentItemWriterBean; 32 | 33 | private String writerExecutorClassName; 34 | 35 | // listener 36 | private LinkedHashSet jobExecutionListenerClassNames; 37 | private LinkedHashSet stepExecutionListenerClassNames; 38 | // 跳过的异常和无须跳过的异常 39 | private String skipExceptionClassName; 40 | private String noSkipExceptionClassName; 41 | private Set chunkListenerClassNames; 42 | private Map contextMap; 43 | 44 | public LinkedHashMap readerProcessorMapper() { 45 | if (StandProcessorBean.class.equals(itemProcessorBean.getBeanClass())) { 46 | StandProcessorBean standProcessorBean = (StandProcessorBean) itemProcessorBean.getBeanObj(); 47 | return standProcessorBean.getReaderProcessorMapper(); 48 | } 49 | return null; 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/common/ItemBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.common; 2 | 3 | import cn.hutool.core.bean.BeanUtil; 4 | import lombok.AccessLevel; 5 | import lombok.Data; 6 | import lombok.Setter; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | *

12 | * 13 | *

14 | * 15 | * @author by sikadai 16 | * @version 1.0 17 | * @since 2022/6/12 11:55 18 | */ 19 | @Data 20 | public class ItemBean { 21 | private Class beanClass; 22 | private Map bean; 23 | @Setter(value = AccessLevel.NONE) 24 | private T beanObj; 25 | 26 | public T buildBeanObj() { 27 | if (beanObj == null) { 28 | this.beanObj = BeanUtil.toBean(bean, beanClass); 29 | } 30 | return this.beanObj; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/common/ItemProcessorBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.common; 2 | 3 | import com.sika.code.batch.standard.bean.processor.BaseProcessorBean; 4 | 5 | /** 6 | *
 7 |  *  处理Bean
 8 |  * 
9 | * 10 | * @author sikadai 11 | * @version 1.0 12 | * @since 2022/6/16 23:11 13 | */ 14 | public class ItemProcessorBean extends ItemBean { 15 | } 16 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/common/ItemReaderBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.common; 2 | 3 | import com.sika.code.batch.standard.bean.reader.BaseReaderBean; 4 | 5 | /** 6 | *
 7 |  *  读取Bean
 8 |  * 
9 | * 10 | * @author sikadai 11 | * @version 1.0 12 | * @since 2022/6/16 23:11 13 | */ 14 | public class ItemReaderBean extends ItemBean { 15 | } 16 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/common/ItemWriterBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.common; 2 | 3 | import com.sika.code.batch.standard.bean.writer.BaseWriterBean; 4 | 5 | /** 6 | *
 7 |  *  写Bean
 8 |  * 
9 | * 10 | * @author sikadai 11 | * @version 1.0 12 | * @since 2022/6/16 23:11 13 | */ 14 | public class ItemWriterBean extends ItemBean { 15 | @Override 16 | public T buildBeanObj() { 17 | T writerBean = super.buildBeanObj(); 18 | writerBean.build(); 19 | return writerBean; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/processor/BaseProcessorBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.processor; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.LinkedHashMap; 6 | import java.util.LinkedHashSet; 7 | 8 | /** 9 | *

10 | * 基础处理器Bean 11 | *

12 | * 13 | * @author by sikadai 14 | * @version 1.0 15 | * @since 2022/6/12 11:18 16 | */ 17 | @Data 18 | public class BaseProcessorBean { 19 | // 构建者ClassName 20 | private String builderClassName; 21 | // 输入和输出的映射关系 22 | private LinkedHashMap readerProcessorMapper; 23 | private LinkedHashSet listenerClassNames; 24 | } 25 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/processor/StandProcessorBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.processor; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | *

7 | * 8 | *

9 | * 10 | * @author by sikadai 11 | * @version 1.0 12 | * @since 2022/6/12 18:40 13 | */ 14 | @Data 15 | public class StandProcessorBean extends BaseProcessorBean{ 16 | } 17 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/reader/BaseReaderBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.reader; 2 | 3 | import com.sika.code.batch.standard.constant.BatchConstant; 4 | import lombok.Data; 5 | 6 | import java.util.LinkedHashSet; 7 | 8 | /** 9 | *

10 | * 基础读取器bean 11 | *

12 | * 13 | * @author by sikadai 14 | * @version 1.0 15 | * @since 2022/6/12 11:18 16 | */ 17 | @Data 18 | public class BaseReaderBean { 19 | private String builderClassName; 20 | private LinkedHashSet listenerClassNames; 21 | protected Integer pageSize = BatchConstant.PAGE_SIZE_INIT; 22 | } 23 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/reader/FlatReaderBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.reader; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.LinkedHashSet; 6 | 7 | /** 8 | *

9 | * 10 | *

11 | * 12 | * @author by sikadai 13 | * @version 1.0 14 | * @since 2022/6/12 18:17 15 | */ 16 | @Data 17 | public class FlatReaderBean extends BaseReaderBean { 18 | private LinkedHashSet names; 19 | private String source; 20 | private String delimiter; 21 | private int linesToSkip; 22 | } 23 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/reader/JdbcReaderBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.reader; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.LinkedHashMap; 6 | 7 | /** 8 | *

9 | * JDBC的读取器 10 | *

11 | * 12 | * @author by sikadai 13 | * @version 1.0 14 | * @since 2022/6/12 18:23 15 | */ 16 | @Data 17 | public class JdbcReaderBean extends BaseReaderBean { 18 | // 查询的sql 19 | private String selectSql; 20 | // from的sql 21 | private String fromSql; 22 | // where条件sql 23 | private String whereSql; 24 | // 排序key和类型的映射 25 | private LinkedHashMap sortKeyType; 26 | // 结果集的映射 27 | private LinkedHashMap resultSetKey; 28 | } 29 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/reader/MethodReaderBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.reader; 2 | 3 | import com.google.common.collect.Maps; 4 | import com.sika.code.batch.standard.constant.BatchConstant; 5 | import com.sika.code.core.util.BeanUtil; 6 | import lombok.Data; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | *

12 | * 方法阅读Bean 13 | *

14 | * 15 | * @author by sikadai 16 | * @version 1.0 17 | * @since 2022/6/12 18:17 18 | */ 19 | @Data 20 | public class MethodReaderBean extends BaseReaderBean { 21 | private String className; 22 | private String methodName; 23 | private String indexName; 24 | private Long startIndex; 25 | private String queryClassName; 26 | private Map query; 27 | 28 | public Object buildQuery() { 29 | if (query == null) { 30 | query = Maps.newLinkedHashMap(); 31 | } 32 | if (pageSize == null) { 33 | pageSize = BatchConstant.PAGE_SIZE_INIT; 34 | } 35 | if (startIndex == null) { 36 | startIndex = BatchConstant.START_INDEX_INIT; 37 | } 38 | query.put(BatchConstant.PAGE_SIZE_KEY, pageSize); 39 | query.put(BatchConstant.START_INDEX_KEY, startIndex); 40 | return BeanUtil.toBean(query, BeanUtil.getTClass(queryClassName)); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/reader/RestReaderBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.reader; 2 | 3 | import cn.hutool.core.text.StrPool; 4 | import cn.hutool.core.util.StrUtil; 5 | import com.google.common.collect.Maps; 6 | import com.sika.code.batch.standard.constant.BatchConstant; 7 | import lombok.Data; 8 | 9 | import java.util.Map; 10 | import java.util.Set; 11 | 12 | /** 13 | *

14 | * 方法阅读Bean 15 | *

16 | * 17 | * @author by sikadai 18 | * @version 1.0 19 | * @since 2022/6/12 18:17 20 | */ 21 | @Data 22 | public class RestReaderBean extends BaseReaderBean { 23 | private String domain; 24 | private String path; 25 | private String requestType; 26 | private String indexName; 27 | private Long startIndex; 28 | private Map query; 29 | private String fullUrl; 30 | private String codeName; 31 | private Set successCodes; 32 | private String msgName; 33 | private String dataName; 34 | 35 | public String buildFullUrl() { 36 | if (this.fullUrl == null) { 37 | this.fullUrl = StrUtil.join(StrPool.SLASH, domain, path); 38 | } 39 | return this.fullUrl; 40 | } 41 | 42 | public Map buildQuery() { 43 | if (query == null) { 44 | query = Maps.newLinkedHashMap(); 45 | } 46 | if (startIndex == null) { 47 | this.startIndex = BatchConstant.START_INDEX_INIT; 48 | } 49 | if (pageSize == null) { 50 | this.pageSize = BatchConstant.PAGE_SIZE_INIT; 51 | } 52 | query.put(BatchConstant.PAGE_SIZE_KEY, pageSize); 53 | query.put(BatchConstant.START_INDEX_KEY, startIndex); 54 | return query; 55 | } 56 | 57 | public String buildRequestType() { 58 | if (StrUtil.isBlank(this.requestType)) { 59 | this.requestType = "POST"; 60 | } 61 | return requestType; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/writer/BaseWriterBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.writer; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.sika.code.batch.standard.builder.writerdata.BaseWriterDataBuilder; 5 | import com.sika.code.batch.standard.builder.writerdata.DefaultWriterDataBuilder; 6 | import com.sika.code.core.util.BeanUtil; 7 | import lombok.Data; 8 | 9 | import java.util.LinkedHashMap; 10 | import java.util.LinkedHashSet; 11 | import java.util.Map; 12 | 13 | /** 14 | *

15 | * 基础写Bean 16 | *

17 | * 18 | * @author by sikadai 19 | * @version 1.0 20 | * @since 2022/6/12 11:18 21 | */ 22 | @Data 23 | public class BaseWriterBean { 24 | private String builderClassName; 25 | private LinkedHashSet listenerClassNames; 26 | private LinkedHashMap processorWriterMapper; 27 | private String writerDataBuilderClassName; 28 | 29 | private BaseWriterDataBuilder> baseWriterDataBuilder; 30 | 31 | private boolean build = false; 32 | 33 | protected void buildBaseWriterDataBuilder() { 34 | if (baseWriterDataBuilder != null) { 35 | return; 36 | } 37 | if (StrUtil.isBlank(writerDataBuilderClassName)) { 38 | this.writerDataBuilderClassName = DefaultWriterDataBuilder.class.getName(); 39 | } 40 | this.baseWriterDataBuilder = 41 | ((BaseWriterDataBuilder>) BeanUtil.newInstance(writerDataBuilderClassName)) 42 | .setBaseWriterBean(BeanUtil.toBean(this, this.getClass())); 43 | } 44 | 45 | public final void build() { 46 | if (build) { 47 | return; 48 | } 49 | doBuild(); 50 | this.build = true; 51 | } 52 | 53 | protected void doBuild() { 54 | buildBaseWriterDataBuilder(); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/writer/FlatWriterBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.writer; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | *

7 | * 平面文件写的Bean 8 | *

9 | * 10 | * @author by sikadai 11 | * @version 1.0 12 | * @since 2022/6/12 18:28 13 | */ 14 | @Data 15 | public class FlatWriterBean extends BaseWriterBean { 16 | private String subBuilderClassName; 17 | private String source; 18 | // 每个文件的数量 19 | private Integer perSourceNum; 20 | private String delimiter; 21 | } 22 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/writer/JdbcWriterBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.writer; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | *

7 | * JDBC写Bean 8 | *

9 | * 10 | * @author by sikadai 11 | * @version 1.0 12 | * @since 2022/6/12 18:38 13 | */ 14 | @Data 15 | public class JdbcWriterBean extends BaseWriterBean{ 16 | private String tableName; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/writer/MethodWriterBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.writer; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | *

7 | * 方法写入的Bean 8 | *

9 | * 10 | * @author by sikadai 11 | * @version 1.0 12 | * @since 2022/6/12 18:28 13 | */ 14 | @Data 15 | public class MethodWriterBean extends BaseWriterBean { 16 | private String className; 17 | private String methodName; 18 | private String paramsClassName; 19 | } 20 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/writer/RedisWriterBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.writer; 2 | 3 | import cn.hutool.core.lang.Assert; 4 | import cn.hutool.core.text.StrPool; 5 | import cn.hutool.core.util.StrUtil; 6 | import com.sika.code.core.base.constant.BaseTypeEnum; 7 | import com.sika.code.batch.standard.constant.RedisStoreTypeEnum; 8 | import lombok.Data; 9 | 10 | /** 11 | *
12 |  *
13 |  * 
14 | * 15 | * @author sikadai 16 | * @version 1.0 17 | * @since 2022/6/25 14:11 18 | */ 19 | @Data 20 | public class RedisWriterBean extends BaseWriterBean { 21 | private String redisKey; 22 | private Integer groupNum; 23 | private Long expireSecond; 24 | private String key; 25 | private Integer redisStoreType; 26 | private RedisStoreTypeEnum redisStoreTypeEnum; 27 | 28 | 29 | @Override 30 | public void doBuild() { 31 | super.doBuild(); 32 | Assert.notBlank(redisKey, "redisKey不能为空"); 33 | Assert.notBlank(key, "关键字的KEY不能为空"); 34 | 35 | if (redisStoreType == null) { 36 | redisStoreType = RedisStoreTypeEnum.SET.getType(); 37 | } 38 | redisStoreTypeEnum = BaseTypeEnum.find(redisStoreType, RedisStoreTypeEnum.class); 39 | 40 | this.redisKey = StrUtil.join(StrPool.COLON, this.redisKey, redisStoreTypeEnum.name()); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/bean/writer/RestWriterBean.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.bean.writer; 2 | 3 | import cn.hutool.core.text.StrPool; 4 | import cn.hutool.core.util.StrUtil; 5 | import lombok.Data; 6 | 7 | import java.util.Set; 8 | 9 | /** 10 | *

11 | * 方法写入的Bean 12 | *

13 | * 14 | * @author by sikadai 15 | * @version 1.0 16 | * @since 2022/6/12 18:28 17 | */ 18 | @Data 19 | public class RestWriterBean extends BaseWriterBean { 20 | private String domain; 21 | private String path; 22 | private String requestType; 23 | private String codeName; 24 | private Set successCodes; 25 | private String msgName; 26 | private String fullUrl; 27 | 28 | 29 | public String buildFullUrl() { 30 | if (this.fullUrl == null) { 31 | this.fullUrl = StrUtil.join(StrPool.SLASH, domain, path); 32 | } 33 | return this.fullUrl; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/builder/item/processor/StandardProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.builder.item.processor; 2 | 3 | import com.sika.code.batch.core.builder.BaseItemProcessorBuilder; 4 | import com.sika.code.batch.standard.bean.common.BatchBean; 5 | import com.sika.code.batch.standard.item.processor.StandardProcessor; 6 | import org.springframework.batch.item.ItemProcessor; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | *

12 | * 13 | *

14 | * 15 | * @author by sikadai 16 | * @version 1.0 17 | * @since 2022/6/3 18:29 18 | */ 19 | public class StandardProcessorBuilder implements BaseItemProcessorBuilder, Map> { 20 | @Override 21 | public ItemProcessor, Map> build(BatchBean batchBean) { 22 | return new StandardProcessor().setBatchBean(batchBean); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/builder/item/reader/StandardFlatItemReaderBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.builder.item.reader; 2 | 3 | import cn.hutool.core.util.ArrayUtil; 4 | import com.sika.code.batch.core.builder.BaseItemReaderBuilder; 5 | import com.sika.code.batch.standard.bean.common.BatchBean; 6 | import com.sika.code.batch.standard.bean.common.ItemReaderBean; 7 | import com.sika.code.batch.standard.bean.reader.FlatReaderBean; 8 | import com.sika.code.batch.standard.config.JSONBeanWrapperFieldSetMapper; 9 | import org.springframework.batch.item.ItemReader; 10 | import org.springframework.batch.item.file.FlatFileItemReader; 11 | import org.springframework.batch.item.file.mapping.DefaultLineMapper; 12 | import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; 13 | import org.springframework.core.io.ClassPathResource; 14 | 15 | import java.util.Map; 16 | 17 | /** 18 | *

19 | * 20 | *

21 | * 22 | * @author by sikadai 23 | * @version 1.0 24 | * @since 2022/6/3 18:00 25 | */ 26 | public class StandardFlatItemReaderBuilder implements BaseItemReaderBuilder> { 27 | @Override 28 | public ItemReader> build(BatchBean batchBean) { 29 | ItemReaderBean itemBean = batchBean.getItemReaderBean(); 30 | FlatReaderBean readerBean = (FlatReaderBean) itemBean.buildBeanObj(); 31 | // FlatFileItemReader是一个用来加载文件的itemReader 32 | FlatFileItemReader> reader = new FlatFileItemReader<>(); 33 | // 跳过第一行的标题 34 | reader.setLinesToSkip(readerBean.getLinesToSkip()); 35 | // 设置csv的位置 36 | reader.setResource(new ClassPathResource(readerBean.getSource())); 37 | // 设置每一行的数据信息 38 | reader.setLineMapper(new DefaultLineMapper>() {{ 39 | setLineTokenizer(new DelimitedLineTokenizer() {{ 40 | setNames(ArrayUtil.toArray(readerBean.getNames(), String.class)); 41 | // 配置列于列之间的间隔符,会通过间隔符对每一行进行切分 42 | setDelimiter(readerBean.getDelimiter()); 43 | }}); 44 | 45 | // 设置要映射的实体类属性 46 | setFieldSetMapper(new JSONBeanWrapperFieldSetMapper()); 47 | }}); 48 | return reader; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/builder/item/reader/StandardJdbcCursorItemReaderBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.builder.item.reader; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.sika.code.core.base.pojo.domain.factory.MetaSpringUtil; 5 | import com.sika.code.batch.core.builder.BaseItemReaderBuilder; 6 | import com.sika.code.batch.standard.bean.common.BatchBean; 7 | import lombok.Setter; 8 | import org.springframework.batch.item.ItemReader; 9 | import org.springframework.batch.item.database.builder.JdbcCursorItemReaderBuilder; 10 | import org.springframework.jdbc.core.RowMapper; 11 | 12 | import javax.sql.DataSource; 13 | import java.sql.ResultSet; 14 | import java.sql.SQLException; 15 | import java.util.LinkedHashMap; 16 | import java.util.Map; 17 | 18 | /** 19 | *

20 | * 21 | *

22 | * 23 | * @author by sikadai 24 | * @version 1.0 25 | * @since 2022/6/5 7:56 26 | */ 27 | @Setter 28 | public class StandardJdbcCursorItemReaderBuilder implements BaseItemReaderBuilder> { 29 | private DataSource dataSource; 30 | private static final String QUERY_SQL_TEMPLATE = "select {} from {} where {} order by id desc"; 31 | 32 | @Override 33 | public ItemReader> build(BatchBean batchBean) { 34 | String sql = StrUtil.format(QUERY_SQL_TEMPLATE, "username,nickname,avatar", "lf_third_oauth_user", "1=1"); 35 | dataSource = MetaSpringUtil.getBean(DataSource.class); 36 | JdbcCursorItemReaderBuilder> jdbcCursorItemReaderBuilder = new JdbcCursorItemReaderBuilder<>(); 37 | return jdbcCursorItemReaderBuilder.dataSource(dataSource) 38 | .rowMapper(new StandardJdbcCursorRowMapper()) 39 | .fetchSize(5000) 40 | .sql(sql) 41 | .saveState(false) 42 | .build(); 43 | } 44 | 45 | public static class StandardJdbcCursorRowMapper implements RowMapper> { 46 | @Override 47 | public Map mapRow(ResultSet resultSet, int i) throws SQLException { 48 | Map map = new LinkedHashMap<>(); 49 | map.put("username", resultSet.getObject("username")); 50 | map.put("nickname", resultSet.getObject("nickname")); 51 | map.put("avatar", resultSet.getObject("avatar")); 52 | return map; 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/builder/item/reader/StandardMethodItemReaderBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.builder.item.reader; 2 | 3 | import com.sika.code.batch.core.builder.BaseItemReaderBuilder; 4 | import com.sika.code.batch.standard.bean.common.BatchBean; 5 | import com.sika.code.batch.standard.bean.common.ItemReaderBean; 6 | import com.sika.code.batch.standard.bean.reader.MethodReaderBean; 7 | import com.sika.code.batch.standard.item.reader.MethodReaderItemSupport; 8 | import lombok.Setter; 9 | import org.springframework.batch.item.ItemReader; 10 | 11 | import java.util.Map; 12 | 13 | /** 14 | *

15 | * 16 | *

17 | * 18 | * @author by sikadai 19 | * @version 1.0 20 | * @since 2022/6/3 18:00 21 | */ 22 | @Setter 23 | public class StandardMethodItemReaderBuilder implements BaseItemReaderBuilder> { 24 | @Override 25 | public ItemReader> build(BatchBean batchBean) { 26 | ItemReaderBean itemBean = batchBean.getItemReaderBean(); 27 | MethodReaderBean readerBean = (MethodReaderBean) itemBean.buildBeanObj(); 28 | // MethodReaderSupport是方法读取器 29 | MethodReaderItemSupport itemSupport = new MethodReaderItemSupport().setReaderBean(readerBean); 30 | itemSupport.setPageSize(readerBean.getPageSize()); 31 | return itemSupport; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/builder/item/reader/StandardRestItemReaderBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.builder.item.reader; 2 | 3 | import com.sika.code.batch.core.builder.BaseItemReaderBuilder; 4 | import com.sika.code.batch.standard.bean.common.BatchBean; 5 | import com.sika.code.batch.standard.bean.common.ItemReaderBean; 6 | import com.sika.code.batch.standard.bean.reader.RestReaderBean; 7 | import com.sika.code.batch.standard.item.reader.RestReaderItemSupport; 8 | import lombok.Setter; 9 | import org.springframework.batch.item.ItemReader; 10 | 11 | import java.util.Map; 12 | 13 | /** 14 | *

15 | * 16 | *

17 | * 18 | * @author by sikadai 19 | * @version 1.0 20 | * @since 2022/6/3 18:00 21 | */ 22 | @Setter 23 | public class StandardRestItemReaderBuilder implements BaseItemReaderBuilder> { 24 | @Override 25 | public ItemReader> build(BatchBean batchBean) { 26 | ItemReaderBean itemBean = batchBean.getItemReaderBean(); 27 | RestReaderBean readerBean = (RestReaderBean) itemBean.buildBeanObj(); 28 | // RestReaderSupport是方法读取器 29 | RestReaderItemSupport itemSupport = new RestReaderItemSupport().setReaderBean(readerBean); 30 | itemSupport.setPageSize(readerBean.getPageSize()); 31 | return itemSupport; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/builder/item/writer/StandardFlatItemWriterBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.builder.item.writer; 2 | 3 | import com.sika.code.batch.core.builder.BaseItemWriterBuilder; 4 | import com.sika.code.batch.standard.bean.common.BatchBean; 5 | import com.sika.code.batch.standard.bean.common.ItemWriterBean; 6 | import com.sika.code.batch.standard.bean.writer.FlatWriterBean; 7 | import com.sika.code.batch.standard.item.writer.FlatFileItemWriterSupport; 8 | import org.springframework.batch.item.ItemWriter; 9 | import org.springframework.batch.item.file.transform.DelimitedLineAggregator; 10 | import org.springframework.core.io.FileSystemResource; 11 | import org.springframework.core.io.Resource; 12 | 13 | import java.util.Map; 14 | 15 | /** 16 | *

17 | * 18 | *

19 | * 20 | * @author by sikadai 21 | * @version 1.0 22 | * @since 2022/6/3 18:30 23 | */ 24 | public class StandardFlatItemWriterBuilder implements BaseItemWriterBuilder> { 25 | 26 | @Override 27 | public ItemWriter> build(BatchBean batchBean) { 28 | ItemWriterBean itemWriterBean = batchBean.getCurrentItemWriterBean(); 29 | FlatWriterBean flatWriterBean = (FlatWriterBean) itemWriterBean.buildBeanObj(); 30 | // 通过Jdbc写入到数据库中 31 | FlatFileItemWriterSupport writer = new FlatFileItemWriterSupport() 32 | .setDataBuilder(flatWriterBean.getBaseWriterDataBuilder()); 33 | try { 34 | DelimitedLineAggregator> aggregator = new DelimitedLineAggregator<>(); 35 | aggregator.setDelimiter(flatWriterBean.getDelimiter()); 36 | 37 | Resource source = new FileSystemResource(flatWriterBean.getSource()); 38 | writer.setResource(source); 39 | writer.setLineAggregator(aggregator); 40 | writer.afterPropertiesSet(); 41 | } catch (Exception e) { 42 | throw new RuntimeException(e.getMessage(), e); 43 | } 44 | return writer; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/builder/item/writer/StandardMethodItemWriterBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.builder.item.writer; 2 | 3 | import com.sika.code.batch.core.builder.BaseItemWriterBuilder; 4 | import com.sika.code.batch.standard.bean.common.BatchBean; 5 | import com.sika.code.batch.standard.bean.common.ItemWriterBean; 6 | import com.sika.code.batch.standard.bean.writer.MethodWriterBean; 7 | import com.sika.code.batch.standard.item.writer.MethodWriterItemSupport; 8 | import lombok.Data; 9 | import org.springframework.batch.item.ItemWriter; 10 | 11 | import java.util.Map; 12 | 13 | /** 14 | *

15 | * 16 | *

17 | * 18 | * @author by sikadai 19 | * @version 1.0 20 | * @since 2022/6/3 19:05 21 | */ 22 | @Data 23 | public class StandardMethodItemWriterBuilder implements BaseItemWriterBuilder> { 24 | 25 | @Override 26 | public ItemWriter> build(BatchBean batchBean) { 27 | ItemWriterBean itemWriterBean = batchBean.getCurrentItemWriterBean(); 28 | MethodWriterBean methodWriterBean = (MethodWriterBean) itemWriterBean.buildBeanObj(); 29 | // 获取标准的处理类,通过调用目标写入到数据库中 30 | return new MethodWriterItemSupport() 31 | .setWriterBean(methodWriterBean) 32 | .setDataBuilder(methodWriterBean.getBaseWriterDataBuilder()); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/builder/item/writer/StandardMultiResourceItemWriterBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.builder.item.writer; 2 | 3 | import com.sika.code.batch.core.builder.BaseItemWriterBuilder; 4 | import com.sika.code.batch.core.factory.BatchFactory; 5 | import com.sika.code.batch.core.item.writer.MultiResourceItemWriterSupport; 6 | import com.sika.code.batch.standard.bean.common.BatchBean; 7 | import com.sika.code.batch.standard.bean.common.ItemWriterBean; 8 | import com.sika.code.batch.standard.bean.writer.FlatWriterBean; 9 | import lombok.Data; 10 | import org.springframework.batch.item.ItemWriter; 11 | import org.springframework.batch.item.file.MultiResourceItemWriter; 12 | import org.springframework.batch.item.file.ResourceAwareItemWriterItemStream; 13 | import org.springframework.core.io.FileSystemResource; 14 | import org.springframework.core.io.Resource; 15 | 16 | import java.util.Map; 17 | 18 | /** 19 | *

20 | * 多资源文件构建器 21 | *

22 | * 23 | * @author by sikadai 24 | * @version 1.0 25 | * @since 2022/6/4 9:13 26 | */ 27 | @Data 28 | public class StandardMultiResourceItemWriterBuilder implements BaseItemWriterBuilder> { 29 | 30 | @Override 31 | public ItemWriter> build(BatchBean batchBean) { 32 | // 拆分写入多个文件 33 | MultiResourceItemWriter> writer = new MultiResourceItemWriterSupport<>(); 34 | ItemWriterBean itemWriterBean = batchBean.getCurrentItemWriterBean(); 35 | FlatWriterBean flatWriterBean = (FlatWriterBean) itemWriterBean.buildBeanObj(); 36 | try { 37 | // 获取子写item 38 | ResourceAwareItemWriterItemStream> writerItem = subWriterItem(flatWriterBean, batchBean); 39 | Resource source = new FileSystemResource(flatWriterBean.getSource()); 40 | writer.setResource(source); 41 | writer.setItemCountLimitPerResource(flatWriterBean.getPerSourceNum()); 42 | writer.setDelegate(writerItem); 43 | } catch (Exception e) { 44 | throw new RuntimeException(e.getMessage(), e); 45 | } 46 | return writer; 47 | } 48 | 49 | private ResourceAwareItemWriterItemStream> subWriterItem(FlatWriterBean writerBean, BatchBean batchBean) { 50 | return (ResourceAwareItemWriterItemStream>) BatchFactory.getItemWriter(batchBean, writerBean.getSubBuilderClassName()); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/builder/item/writer/StandardRedisBatchItemWriterBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.builder.item.writer; 2 | 3 | import com.sika.code.core.base.pojo.domain.factory.MetaSpringUtil; 4 | import com.sika.code.batch.core.builder.BaseItemWriterBuilder; 5 | import com.sika.code.batch.standard.bean.common.BatchBean; 6 | import com.sika.code.batch.standard.bean.common.ItemWriterBean; 7 | import com.sika.code.batch.standard.bean.writer.RedisWriterBean; 8 | import com.sika.code.batch.standard.item.writer.RedisBatchItemWriterSupport; 9 | import lombok.Data; 10 | import org.springframework.batch.item.ItemWriter; 11 | import org.springframework.data.redis.core.StringRedisTemplate; 12 | 13 | import java.util.Map; 14 | 15 | /** 16 | *

17 | * 18 | *

19 | * 20 | * @author by sikadai 21 | * @version 1.0 22 | * @since 2022/6/3 19:05 23 | */ 24 | @Data 25 | public class StandardRedisBatchItemWriterBuilder implements BaseItemWriterBuilder> { 26 | 27 | @Override 28 | public ItemWriter> build(BatchBean batchBean) { 29 | ItemWriterBean itemWriterBean = batchBean.getCurrentItemWriterBean(); 30 | RedisWriterBean redisWriterBean = (RedisWriterBean) itemWriterBean.buildBeanObj(); 31 | // 获取标准的处理类,通过Redis写入到数据库中 32 | RedisBatchItemWriterSupport writer = new RedisBatchItemWriterSupport() 33 | .setDataBuilder(redisWriterBean.getBaseWriterDataBuilder()) 34 | .setStringRedisTemplate(MetaSpringUtil.getBean(StringRedisTemplate.class)) 35 | .setRedisWriterBean(redisWriterBean); 36 | return writer; 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/builder/item/writer/StandardRestItemWriterBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.builder.item.writer; 2 | 3 | import com.sika.code.batch.core.builder.BaseItemWriterBuilder; 4 | import com.sika.code.batch.standard.bean.common.BatchBean; 5 | import com.sika.code.batch.standard.bean.common.ItemWriterBean; 6 | import com.sika.code.batch.standard.bean.writer.RestWriterBean; 7 | import com.sika.code.batch.standard.item.writer.RestWriterItemSupport; 8 | import lombok.Data; 9 | import org.springframework.batch.item.ItemWriter; 10 | 11 | import java.util.Map; 12 | 13 | /** 14 | *

15 | * 16 | *

17 | * 18 | * @author by sikadai 19 | * @version 1.0 20 | * @since 2022/6/3 19:05 21 | */ 22 | @Data 23 | public class StandardRestItemWriterBuilder implements BaseItemWriterBuilder> { 24 | 25 | @Override 26 | public ItemWriter> build(BatchBean batchBean) { 27 | ItemWriterBean itemWriterBean = batchBean.getCurrentItemWriterBean(); 28 | RestWriterBean restWriterBean = (RestWriterBean) itemWriterBean.buildBeanObj(); 29 | // 获取标准的处理类,通过调用目标写入到数据库中 30 | return new RestWriterItemSupport() 31 | .setWriterBean(restWriterBean) 32 | .setDataBuilder(restWriterBean.getBaseWriterDataBuilder()); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/builder/writerdata/BaseWriterDataBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.builder.writerdata; 2 | 3 | import com.sika.code.batch.standard.bean.writer.BaseWriterBean; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | *

11 | * 基础写数据构建者 12 | *

13 | * 14 | * @author by sikadai 15 | * @version 1.0 16 | * @since 2022/6/19 17:05 17 | */ 18 | @Data 19 | @Accessors(chain = true) 20 | public abstract class BaseWriterDataBuilder { 21 | protected BaseWriterBean baseWriterBean; 22 | public abstract List build(List items); 23 | } 24 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/builder/writerdata/DefaultWriterDataBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.builder.writerdata; 2 | 3 | import com.sika.code.batch.core.factory.BatchFactory; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | /** 11 | *

12 | * 默认的写数据构建者 13 | *

14 | * 15 | * @author by sikadai 16 | * @version 1.0 17 | * @since 2022/6/19 17:05 18 | */ 19 | @Data 20 | @Accessors(chain = true) 21 | public class DefaultWriterDataBuilder extends BaseWriterDataBuilder> { 22 | @Override 23 | public List> build(List> items) { 24 | return BatchFactory.buildWriterItemDatas(items, baseWriterBean.getProcessorWriterMapper()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/command/BatchCommander.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.command; 2 | 3 | import cn.hutool.core.util.IdUtil; 4 | import org.springframework.batch.core.Job; 5 | import org.springframework.batch.core.JobParameters; 6 | import org.springframework.batch.core.JobParametersBuilder; 7 | import org.springframework.batch.core.launch.support.SimpleJobLauncher; 8 | import org.springframework.batch.core.repository.JobRepository; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.stereotype.Component; 11 | 12 | import java.util.Date; 13 | 14 | /** 15 | *

16 | * 17 | *

18 | * 19 | * @author by sikadai 20 | * @version 1.0 21 | * @since 2022/6/11 10:54 22 | */ 23 | @Component 24 | public class BatchCommander { 25 | @Autowired 26 | private SimpleJobLauncher jobLauncher; 27 | @Autowired 28 | private JobRepository jobRepository; 29 | private static final String JOB_DATE = "jobDate"; 30 | private static final String JOB_ID = "jobId"; 31 | 32 | /** 33 | * @param job : 执行的JOB 34 | * @param jobParameters : JOB参数 35 | */ 36 | public void execute(Job job, JobParameters jobParameters) { 37 | try { 38 | jobLauncher.run(job, jobParameters); 39 | } catch (Exception e) { 40 | throw new RuntimeException(e); 41 | } 42 | } 43 | 44 | public void execute(Job job) { 45 | JobParametersBuilder jobParametersBuilder = new JobParametersBuilder(); 46 | jobParametersBuilder.addDate(JOB_DATE, new Date()); 47 | jobParametersBuilder.addString(JOB_ID, IdUtil.objectId()); 48 | execute(job, jobParametersBuilder.toJobParameters()); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/config/JSONBeanWrapperFieldSetMapper.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.config; 2 | 3 | import com.google.common.collect.Maps; 4 | import org.springframework.batch.item.file.mapping.FieldSetMapper; 5 | import org.springframework.batch.item.file.transform.FieldSet; 6 | import org.springframework.validation.BindException; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | *

12 | * 13 | *

14 | * 15 | * @author by sikadai 16 | * @version 1.0 17 | * @since 2022/5/29 16:23 18 | */ 19 | public class JSONBeanWrapperFieldSetMapper implements FieldSetMapper> { 20 | @Override 21 | public Map mapFieldSet(FieldSet fs) throws BindException { 22 | Map retMap = Maps.newLinkedHashMap(); 23 | for (Map.Entry entity : fs.getProperties().entrySet()) { 24 | retMap.put(entity.getKey().toString(), entity.getValue()); 25 | } 26 | return retMap; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/constant/BatchConstant.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.constant; 2 | 3 | /** 4 | *
 5 |  *  批处理常量
 6 |  * 
7 | * 8 | * @author sikadai 9 | * @version 1.0 10 | * @since 2022/8/3 22:31 11 | */ 12 | public class BatchConstant { 13 | public static final String PAGE_SIZE_KEY = "pageSize"; 14 | public static final String START_INDEX_KEY = "startIndex"; 15 | public static final Integer PAGE_SIZE_INIT = 1000; 16 | public static final Long START_INDEX_INIT = 0L; 17 | /** 自定义上下文 */ 18 | public static final String STEP_EXIT_STATUS = "stepExitStatus"; 19 | } 20 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/constant/RedisStoreTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.constant; 2 | 3 | import com.sika.code.core.base.constant.BaseTypeEnum; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | 7 | /** 8 | *
 9 |  *  Redis存储类型枚举
10 |  * 
11 | * 12 | * @author sikadai 13 | * @version 1.0 14 | * @since 2022/6/26 13:47 15 | */ 16 | @Getter 17 | @AllArgsConstructor 18 | public enum RedisStoreTypeEnum implements BaseTypeEnum { 19 | STRING(10, "字符串类型"), 20 | LIST(20, "List类型"), 21 | SET(30, "Set类型"), 22 | HASH(40, "HASH类型"), 23 | ; 24 | private final Integer type; 25 | private final String desc; 26 | } -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/context/StandardParamContext.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.context; 2 | 3 | import com.sika.code.core.base.constant.BaseConstant; 4 | import com.sika.code.batch.core.context.BaseBatchContext; 5 | import com.sika.code.batch.standard.bean.common.BatchBean; 6 | import lombok.Data; 7 | 8 | import java.util.concurrent.ExecutorService; 9 | import java.util.concurrent.Executors; 10 | 11 | /** 12 | *

13 | * 14 | *

15 | * 16 | * @author by sikadai 17 | * @version 1.0 18 | * @since 2022/6/3 20:38 19 | */ 20 | @Data 21 | public class StandardParamContext extends BaseBatchContext { 22 | private BatchBean batchBean; 23 | private ExecutorService writeExecutorService; 24 | 25 | protected void build() { 26 | if (isAsynWrite()) { 27 | setWriteExecutorService(Executors.newFixedThreadPool(batchBean.getItemWriterBeans().size())); 28 | } 29 | } 30 | 31 | public boolean isAsynWrite() { 32 | return BaseConstant.BooleanEnum.YES.getType().equals(this.batchBean.getAsynWrite()); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/entity/StandardBatchEntity.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.entity; 2 | 3 | import com.sika.code.batch.core.entity.BaseBatchEntity; 4 | import com.sika.code.batch.standard.command.BatchCommander; 5 | import com.sika.code.batch.standard.context.StandardContext; 6 | import org.springframework.batch.core.Job; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Component; 9 | 10 | /** 11 | *

12 | * 标准批次实体 13 | *

14 | * 15 | * @author by sikadai 16 | * @version 1.0 17 | * @since 2022/6/3 13:42 18 | */ 19 | @Component 20 | public class StandardBatchEntity extends BaseBatchEntity { 21 | @Autowired 22 | protected BatchCommander batchCommander; 23 | 24 | @Override 25 | protected void executeBefore(StandardContext context) { 26 | super.executeBefore(context); 27 | // 根据配置进行初始化Writer、reader、processor 28 | buildStandardItem(context); 29 | //构建监听器 30 | buildListener(context); 31 | } 32 | 33 | @Override 34 | protected void doExecute(StandardContext context) { 35 | Job job = context.buildJob(); 36 | // 执行一个批处理任务 37 | batchCommander.execute(job); 38 | } 39 | 40 | protected void buildStandardItem(StandardContext context) { 41 | context.buildStandardItem(); 42 | } 43 | 44 | protected void buildListener(StandardContext context) { 45 | context.buildListeners(); 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/item/processor/StandardProcessor.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.item.processor; 2 | 3 | import cn.hutool.core.collection.CollUtil; 4 | import com.sika.code.batch.core.item.processor.BaseProcessor; 5 | import com.sika.code.batch.standard.bean.common.ItemProcessorBean; 6 | import com.sika.code.batch.standard.bean.processor.StandProcessorBean; 7 | 8 | import java.util.LinkedHashMap; 9 | import java.util.Map; 10 | 11 | /** 12 | *

13 | * 14 | *

15 | * 16 | * @author by sikadai 17 | * @version 1.0 18 | * @since 2022/6/3 13:43 19 | */ 20 | public class StandardProcessor extends BaseProcessor, Map> { 21 | 22 | @Override 23 | public Map process(Map item) { 24 | ItemProcessorBean processorItemBean = batchBean.getItemProcessorBean(); 25 | StandProcessorBean standProcessorBean = (StandProcessorBean) processorItemBean.buildBeanObj(); 26 | Map inoutMapper = standProcessorBean.getReaderProcessorMapper(); 27 | Map retMap = new LinkedHashMap<>(); 28 | if (CollUtil.isEmpty(inoutMapper)) { 29 | retMap.putAll(item); 30 | return retMap; 31 | } 32 | for (Map.Entry inOutMapper : inoutMapper.entrySet()) { 33 | Object value = item.get(inOutMapper.getKey()); 34 | if (value == null) { 35 | continue; 36 | } 37 | retMap.put(inOutMapper.getValue(), value); 38 | } 39 | return retMap; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/item/reader/RestReaderItemSupport.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.item.reader; 2 | 3 | import cn.hutool.core.collection.CollUtil; 4 | import cn.hutool.core.map.MapUtil; 5 | import cn.hutool.core.text.CharSequenceUtil; 6 | import com.dtflys.forest.Forest; 7 | import com.sika.code.batch.standard.bean.reader.RestReaderBean; 8 | import com.sika.code.batch.standard.util.BatchUtil; 9 | import com.sika.code.core.base.util.JSONUtil; 10 | import lombok.Data; 11 | import lombok.experimental.Accessors; 12 | import lombok.extern.slf4j.Slf4j; 13 | import org.assertj.core.util.Lists; 14 | import org.springframework.batch.item.database.AbstractPagingItemReader; 15 | 16 | import java.util.Collection; 17 | import java.util.List; 18 | import java.util.Map; 19 | 20 | /** 21 | *
22 |  *  方法读取支持器
23 |  * 
24 | * 25 | * @author sikadai 26 | * @version 1.0 27 | * @since 2022/6/25 13:37 28 | */ 29 | @Data 30 | @Accessors(chain = true) 31 | @Slf4j 32 | public class RestReaderItemSupport extends AbstractPagingItemReader> { 33 | private RestReaderBean readerBean; 34 | private static final String INDEX_NAME = "id"; 35 | 36 | @Override 37 | protected void doReadPage() { 38 | if (results == null) { 39 | results = Lists.newArrayList(); 40 | } else { 41 | results.clear(); 42 | } 43 | results.addAll(getRecords()); 44 | // 设置索引值 45 | buildIndexValue(results); 46 | } 47 | 48 | protected Collection> getRecords() { 49 | // 使用post请求 50 | Map retObj = Forest.post(readerBean.buildFullUrl()) 51 | .contentTypeJson() 52 | .addBody(JSONUtil.toJSONString(readerBean.buildQuery())) 53 | .executeAsMap(); 54 | // 校验状态码 55 | BatchUtil.verifyResult(retObj, readerBean.getCodeName(), readerBean.getMsgName(), readerBean.getSuccessCodes()); 56 | return (Collection>) retObj.get(readerBean.getDataName()); 57 | } 58 | 59 | protected void buildIndexValue(List> list) { 60 | String indexName = readerBean.getIndexName(); 61 | if (CharSequenceUtil.isBlank(indexName)) { 62 | indexName = INDEX_NAME; 63 | } 64 | if (CollUtil.isEmpty(list)) { 65 | return; 66 | } 67 | readerBean.setStartIndex(MapUtil.getLong(CollUtil.getLast(list), indexName)); 68 | } 69 | 70 | @Override 71 | protected void doJumpToPage(int i) { 72 | 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/item/reader/StandardReader.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.item.reader; 2 | 3 | import com.sika.code.batch.core.item.reader.BaseReader; 4 | 5 | import java.util.Map; 6 | 7 | /** 8 | *

9 | * 10 | *

11 | * 12 | * @author by sikadai 13 | * @version 1.0 14 | * @since 2022/6/3 13:43 15 | */ 16 | public class StandardReader extends BaseReader> { 17 | } 18 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/item/writer/FlatFileItemWriterSupport.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.item.writer; 2 | 3 | import com.sika.code.batch.standard.builder.writerdata.BaseWriterDataBuilder; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | import org.springframework.batch.item.file.FlatFileItemWriter; 7 | 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | /** 12 | *

13 | * 支持类 14 | *

15 | * 16 | * @author by sikadai 17 | * @version 1.0 18 | * @since 2022/6/18 20:33 19 | */ 20 | @Data 21 | @Accessors(chain = true) 22 | public class FlatFileItemWriterSupport extends FlatFileItemWriter> { 23 | private BaseWriterDataBuilder> dataBuilder; 24 | 25 | @Override 26 | public String doWrite(List> items) { 27 | return super.doWrite(dataBuilder.build(items)); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/item/writer/JdbcBatchItemWriterSupport.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.item.writer; 2 | 3 | import com.sika.code.batch.standard.builder.writerdata.BaseWriterDataBuilder; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | import org.springframework.batch.item.database.JdbcBatchItemWriter; 7 | 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | /** 12 | *

13 | * 14 | *

15 | * 16 | * @author by sikadai 17 | * @version 1.0 18 | * @since 2022/6/18 20:50 19 | */ 20 | @Data 21 | @Accessors(chain = true) 22 | public class JdbcBatchItemWriterSupport extends JdbcBatchItemWriter> { 23 | private BaseWriterDataBuilder> dataBuilder; 24 | 25 | @Override 26 | public void write(List> items) throws Exception { 27 | super.write(dataBuilder.build(items)); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/item/writer/MethodWriterItemSupport.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.item.writer; 2 | 3 | import cn.hutool.core.util.ReflectUtil; 4 | import com.sika.code.batch.standard.bean.writer.MethodWriterBean; 5 | import com.sika.code.batch.standard.builder.writerdata.BaseWriterDataBuilder; 6 | import com.sika.code.core.util.BeanUtil; 7 | import lombok.Data; 8 | import lombok.experimental.Accessors; 9 | import org.springframework.batch.item.ItemWriter; 10 | 11 | import java.util.List; 12 | import java.util.Map; 13 | 14 | /** 15 | *
16 |  *  方法写入支持器
17 |  * 
18 | * 19 | * @author sikadai 20 | * @version 1.0 21 | * @since 2022/6/25 13:37 22 | */ 23 | @Data 24 | @Accessors(chain = true) 25 | public class MethodWriterItemSupport implements ItemWriter> { 26 | private BaseWriterDataBuilder> dataBuilder; 27 | private MethodWriterBean writerBean; 28 | 29 | @Override 30 | public void write(List> list) throws Exception { 31 | List> buildMap = dataBuilder.build(list); 32 | // 先转化 33 | List waitWriterObjs = BeanUtil.toBeans(buildMap, Class.forName(writerBean.getParamsClassName())); 34 | // 获取实例对象 35 | Object obj = BeanUtil.getBean(writerBean.getClassName()); 36 | // 通过反射调用指定方法 37 | ReflectUtil.invoke(obj, writerBean.getMethodName(), waitWriterObjs); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/item/writer/RestWriterItemSupport.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.item.writer; 2 | 3 | import com.dtflys.forest.Forest; 4 | import com.sika.code.batch.standard.bean.writer.RestWriterBean; 5 | import com.sika.code.batch.standard.builder.writerdata.BaseWriterDataBuilder; 6 | import com.sika.code.batch.standard.util.BatchUtil; 7 | import com.sika.code.core.base.util.JSONUtil; 8 | import lombok.Data; 9 | import lombok.experimental.Accessors; 10 | import lombok.extern.slf4j.Slf4j; 11 | import org.springframework.batch.item.ItemWriter; 12 | 13 | import java.util.List; 14 | import java.util.Map; 15 | 16 | /** 17 | *
18 |  *  方法写入支持器
19 |  * 
20 | * 21 | * @author sikadai 22 | * @version 1.0 23 | * @since 2022/6/25 13:37 24 | */ 25 | @Data 26 | @Accessors(chain = true) 27 | @Slf4j 28 | public class RestWriterItemSupport implements ItemWriter> { 29 | private BaseWriterDataBuilder> dataBuilder; 30 | private RestWriterBean writerBean; 31 | 32 | @Override 33 | public void write(List> list) throws Exception { 34 | List> buildMap = dataBuilder.build(list); 35 | // 使用post请求 36 | Map retMap = Forest.post(writerBean.buildFullUrl()) 37 | .contentTypeJson() 38 | .addBody(JSONUtil.toJSONString(buildMap)) 39 | .executeAsMap(); 40 | // 获取写入结果 41 | // 校验响应的code值-不一致抛出异常 42 | BatchUtil.verifyResult(retMap, writerBean.getCodeName(), writerBean.getMsgName(), writerBean.getSuccessCodes()); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/item/writer/StandardWriterExecutor.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.item.writer; 2 | 3 | import com.sika.code.batch.core.item.writer.BaseWriterExecutor; 4 | 5 | import java.util.Map; 6 | 7 | /** 8 | *

9 | * 标准写执行器 10 | *

11 | * 12 | * @author by sikadai 13 | * @version 1.0 14 | * @since 2022/6/3 13:43 15 | */ 16 | public class StandardWriterExecutor extends BaseWriterExecutor> { 17 | 18 | } 19 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/listener/StandChunkListener.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.listener; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | import org.springframework.batch.core.ChunkListener; 8 | import org.springframework.batch.core.scope.context.ChunkContext; 9 | 10 | import java.util.Map; 11 | 12 | /** 13 | *

14 | * 批处理监听器 15 | *

16 | * 17 | * @author by sikadai 18 | * @version 1.0 19 | * @since 2022/10/2 10:04 20 | */ 21 | @NoArgsConstructor 22 | @AllArgsConstructor 23 | @Getter 24 | @Setter 25 | public class StandChunkListener implements ChunkListener { 26 | 27 | protected Map contextMap; 28 | @Override 29 | public void beforeChunk(ChunkContext chunkContext) { 30 | 31 | } 32 | 33 | @Override 34 | public void afterChunk(ChunkContext chunkContext) { 35 | 36 | } 37 | 38 | @Override 39 | public void afterChunkError(ChunkContext chunkContext) { 40 | 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/listener/StandardJobExecutionListener.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.listener; 2 | 3 | import cn.hutool.core.date.DateUtil; 4 | import com.sika.code.core.base.util.JSONUtil; 5 | import com.sika.code.core.util.BeanUtil; 6 | import com.sika.code.batch.core.listener.BaseJobExecutionListener; 7 | import com.sika.code.batch.standard.store.StandardMapJobRepositoryFactoryBean; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.springframework.batch.core.JobExecution; 10 | 11 | import java.util.Date; 12 | import java.util.Objects; 13 | 14 | /** 15 | *

16 | * 17 | *

18 | * 19 | * @author by sikadai 20 | * @version 1.0 21 | * @since 2022/6/3 11:05 22 | */ 23 | @Slf4j 24 | public class StandardJobExecutionListener implements BaseJobExecutionListener { 25 | static final String BLANK = "\n\r"; 26 | 27 | @Override 28 | public void beforeJob(JobExecution jobExecution) { 29 | log.info(BLANK); 30 | log.info("任务id=【{}】开始执行,实例参数【{}】,JOB参数【{}】, 开始时间:{}", 31 | jobExecution.getJobId(), JSONUtil.toJSONString(jobExecution.getJobInstance()), 32 | JSONUtil.toJSONString(jobExecution.getJobParameters()), DateUtil.formatDateTime(jobExecution.getStartTime())); 33 | } 34 | 35 | 36 | @Override 37 | public void afterJob(JobExecution jobExecution) { 38 | log.info("任务id=【{}】执行完成,JOB参数【{}】, 执行状态【{}】,结束于:【{}】,所用时间为:{}ms,实例参数【{}】", 39 | jobExecution.getJobId(), 40 | JSONUtil.toJSONString(jobExecution.getJobParameters()), jobExecution.getStatus(), 41 | DateUtil.formatDateTime(new Date()), (System.currentTimeMillis() - Objects.requireNonNull(jobExecution.getStartTime()).getTime()), 42 | JSONUtil.toJSONString(jobExecution.getJobInstance())); 43 | clearRepositoryData(jobExecution); 44 | log.info(BLANK); 45 | } 46 | 47 | // 为了防止内存数据被撑爆-每个job执行完成后-执行清理 48 | protected void clearRepositoryData(JobExecution jobExecution) { 49 | log.info("任务id=【{}】清除缓存数据,实例参数【{}】", jobExecution.getJobId(), JSONUtil.toJSONString(jobExecution.getJobInstance())); 50 | StandardMapJobRepositoryFactoryBean jobRepositoryFactoryBean = BeanUtil.getBean(StandardMapJobRepositoryFactoryBean.class); 51 | jobRepositoryFactoryBean.clear(jobExecution); 52 | 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/listener/StandardStepExecutionListener.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.listener; 2 | 3 | import cn.hutool.core.date.DateUtil; 4 | import com.sika.code.batch.core.listener.BaseStepExecutionListener; 5 | import com.sika.code.core.base.util.JSONUtil; 6 | import lombok.Setter; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.batch.core.ExitStatus; 9 | import org.springframework.batch.core.StepExecution; 10 | 11 | import java.util.Date; 12 | import java.util.Map; 13 | 14 | import static com.sika.code.batch.standard.constant.BatchConstant.STEP_EXIT_STATUS; 15 | 16 | /** 17 | *

18 | * 19 | *

20 | * 21 | * @author by sikadai 22 | * @version 1.0 23 | * @since 2022/6/3 11:05 24 | */ 25 | @Slf4j 26 | @Setter 27 | public class StandardStepExecutionListener implements BaseStepExecutionListener { 28 | private Map contextMap; 29 | 30 | @Override 31 | public void beforeStep(StepExecution stepExecution) { 32 | log.info("步骤id=【{}】开始执行,实例对象【{}】, 开始时间:{},JOB参数【{}】", 33 | stepExecution.getId(), JSONUtil.toJSONString(stepExecution.getJobExecution().getJobInstance()), 34 | DateUtil.formatDateTime(stepExecution.getStartTime()), JSONUtil.toJSONString(stepExecution.getJobParameters())); 35 | } 36 | 37 | @Override 38 | public ExitStatus afterStep(StepExecution stepExecution) { 39 | log.info("步骤id=【{}】执行完成, 读取的条数【{}】,写入的条数【{}】,执行状态【{}】,结束于:【{}】,所用时间为:{}ms,JOB参数【{}】,实例参数【{}】,步骤详情参数:【{}】", 40 | stepExecution.getId(), stepExecution.getReadCount(), stepExecution.getWriteCount(), stepExecution.getStatus(), 41 | DateUtil.formatDateTime(new Date()), (System.currentTimeMillis() - stepExecution.getStartTime().getTime()), 42 | JSONUtil.toJSONString(stepExecution.getJobParameters()), 43 | JSONUtil.toJSONString(stepExecution.getJobExecution().getJobInstance()), 44 | JSONUtil.toJSONString(stepExecution)); 45 | contextMap.put(STEP_EXIT_STATUS, stepExecution.getExitStatus()); 46 | return stepExecution.getExitStatus(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/listener/StandardStepProcessListener.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.listener; 2 | 3 | import com.sika.code.batch.core.listener.BaseItemProcessListener; 4 | import lombok.extern.slf4j.Slf4j; 5 | 6 | import java.util.Map; 7 | 8 | 9 | @Slf4j 10 | public class StandardStepProcessListener implements BaseItemProcessListener, Map> { 11 | @Override 12 | public void beforeProcess(Map t) { 13 | // log.info("执行处理之前----"); 14 | } 15 | 16 | @Override 17 | public void afterProcess(Map t, Map s) { 18 | // log.info("执行处理之后----"); 19 | } 20 | 21 | @Override 22 | public void onProcessError(Map t, Exception e) { 23 | 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/listener/StandardStepReadListener.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.listener; 2 | 3 | import com.sika.code.batch.core.listener.BaseItemReadListener; 4 | import lombok.extern.slf4j.Slf4j; 5 | 6 | import java.util.Map; 7 | import java.util.concurrent.atomic.AtomicLong; 8 | 9 | 10 | @Slf4j 11 | public class StandardStepReadListener implements BaseItemReadListener> { 12 | @Override 13 | public void beforeRead() { 14 | // log.info("开始执行读------"); 15 | } 16 | 17 | @Override 18 | public void afterRead(Map t) { 19 | } 20 | 21 | @Override 22 | public void onReadError(Exception e) { 23 | 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/listener/StandardStepWriteListener.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.listener; 2 | 3 | import com.sika.code.batch.core.listener.BaseItemWriteListener; 4 | import lombok.Setter; 5 | import lombok.extern.slf4j.Slf4j; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | @Slf4j 11 | @Setter 12 | public class StandardStepWriteListener implements BaseItemWriteListener> { 13 | protected Map contextMap; 14 | @Override 15 | public void beforeWrite(List> list) { 16 | } 17 | 18 | @Override 19 | public void afterWrite(List> list) { 20 | } 21 | 22 | @Override 23 | public void onWriteError(Exception e, List> list) { 24 | 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/store/bean/StandardJobInstance.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.store.bean; 2 | 3 | import lombok.Getter; 4 | import org.springframework.batch.core.JobInstance; 5 | 6 | /** 7 | *

8 | * 9 | *

10 | * 11 | * @author by sikadai 12 | * @version 1.0 13 | * @since 2022/6/4 12:58 14 | */ 15 | @Getter 16 | public class StandardJobInstance extends JobInstance { 17 | private String instanceKey; 18 | public StandardJobInstance(Long id, String jobName) { 19 | super(id, jobName); 20 | } 21 | 22 | public StandardJobInstance(Long id, String jobName, String instanceKey) { 23 | super(id, jobName); 24 | this.instanceKey = instanceKey; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sika-code-batch/src/main/java/com/sika/code/batch/standard/util/BatchUtil.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.batch.standard.util; 2 | 3 | import cn.hutool.core.collection.CollUtil; 4 | import cn.hutool.core.lang.Assert; 5 | import cn.hutool.core.map.MapUtil; 6 | import cn.hutool.core.text.CharSequenceUtil; 7 | import com.sika.code.core.base.util.JSONUtil; 8 | import lombok.extern.slf4j.Slf4j; 9 | 10 | import java.util.Map; 11 | import java.util.Set; 12 | 13 | /** 14 | *
15 |  *  批处理工具类
16 |  * 
17 | * 18 | * @author sikadai 19 | * @version 1.0 20 | * @since 2022/8/3 22:31 21 | */ 22 | @Slf4j 23 | public class BatchUtil { 24 | 25 | /** 26 | *

27 | * 校验结果 28 | *

29 | * 30 | * @param objectMap : 对象Map 31 | * @param codeName : 编码名称 32 | * @param msgName : 消息名称 33 | * @param successCodes : 成功的响应码 34 | * @return void 35 | * @author sikadai 36 | * @since 2022/8/3 22:39 37 | */ 38 | public static void verifyResult(Map objectMap, String codeName, String msgName, Set successCodes) { 39 | Assert.notNull(objectMap, "响应对象不能为空"); 40 | if (CharSequenceUtil.isBlank(codeName)) { 41 | return; 42 | } 43 | if (CollUtil.isEmpty(successCodes)) { 44 | log.info("没有配置成功响应编码集合"); 45 | return; 46 | } 47 | String code = MapUtil.getStr(objectMap, codeName); 48 | String msg = MapUtil.getStr(objectMap, msgName); 49 | if (CharSequenceUtil.isBlank(code)) { 50 | throw new RuntimeException(CharSequenceUtil.format("codeName【{}】对应的响应码为空", codeName)); 51 | } 52 | if (!successCodes.contains(code)) { 53 | throw new RuntimeException(CharSequenceUtil.format("codeName【{}】对应的响应码【{}】与配置的成功编码列表【{}】不匹配,异常消息为【{}】" 54 | , codeName, code, JSONUtil.toJSONString(successCodes), msg)); 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /sika-code-cache/.flattened-pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | io.github.sika-code-cloud 7 | sika-code 8 | 3.1.2 9 | 10 | io.github.sika-code-cloud 11 | sika-code-cache 12 | 3.1.2 13 | 14 | 15 | MIT License 16 | http://www.opensource.org/licenses/mit-license.php 17 | 18 | 19 | 20 | 8 21 | 8 22 | 23 | 24 | 25 | io.github.sika-code-cloud 26 | sika-code-core 27 | ${revision} 28 | 29 | 30 | org.springframework.boot 31 | spring-boot-starter-data-redis 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /sika-code-cache/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | sika-code 7 | io.github.sika-code-cloud 8 | ${revision} 9 | 10 | 4.0.0 11 | 12 | sika-code-cache 13 | 14 | 15 | 8 16 | 8 17 | 18 | 19 | 20 | io.github.sika-code-cloud 21 | sika-code-core 22 | ${revision} 23 | 24 | 25 | org.springframework.boot 26 | spring-boot-starter-data-redis 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /sika-code-cache/src/main/java/com/sika/code/cache/constant/CacheConstant.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.cache.constant; 2 | 3 | /** 4 | *
 5 |  *  缓存常量
 6 |  * 
7 | * 8 | * @author daiqi 9 | * @version 1.0 10 | * @since 2022/8/5 18:27 11 | */ 12 | public class CacheConstant { 13 | /** 14 | * 默认的有效期 15 | */ 16 | public static final Long EXPIRE_DEFAULT = 60L; 17 | /** 18 | * 初始化缓存大小-默认值 19 | */ 20 | public static final Integer INIT_CACHE_SIZE_DEFAULT = 10; 21 | /** 22 | * 最大缓存大小-默认值 23 | */ 24 | public static final Integer MAX_CACHE_SIZE_DEFAULT = 500; 25 | } 26 | -------------------------------------------------------------------------------- /sika-code-cache/src/main/java/com/sika/code/cache/executor/LocalCacheDefaultExecutor.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.cache.executor; 2 | 3 | import com.github.benmanes.caffeine.cache.Cache; 4 | import com.sika.code.cache.pojo.GetLocalCacheDTO; 5 | 6 | /** 7 | *

8 | * 本地缓存默认执行器 9 | *

10 | * 11 | * @author by sikadai 12 | * @version 1.0 13 | * @since 2022/8/7 17:22 14 | */ 15 | public class LocalCacheDefaultExecutor implements LocalCacheExecutor { 16 | @Override 17 | public T getCache(GetLocalCacheDTO cacheDTO, Cache cache) { 18 | return (T) cache.asMap().get(cacheDTO.getKey()); 19 | } 20 | 21 | @Override 22 | public T doCache(GetLocalCacheDTO cacheDTO, Cache cache, Object cacheValue) { 23 | cache.put(cacheDTO.getKey(), cacheValue); 24 | return (T) cacheValue; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sika-code-cache/src/main/java/com/sika/code/cache/executor/LocalCacheExecutor.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.cache.executor; 2 | 3 | import com.github.benmanes.caffeine.cache.Cache; 4 | import com.sika.code.cache.pojo.GetLocalCacheDTO; 5 | 6 | /** 7 | *

8 | * 9 | *

10 | * 11 | * @author by sikadai 12 | * @version 1.0 13 | * @since 2022/8/7 15:53 14 | */ 15 | public interface LocalCacheExecutor { 16 | /** 17 | * 18 | * @param cacheDTO : 缓存数据传输对象 19 | * @param cache : 本地缓存对象 20 | * @return 缓存中的对象 21 | */ 22 | T getCache(GetLocalCacheDTO cacheDTO, Cache cache); 23 | 24 | /** 25 | * 26 | * @param cacheDTO : 缓存数据传输对象 27 | * @param cache : 本地缓存对象 28 | * @param cacheValue : 缓存值 29 | * @return : 需要缓存的对象 30 | */ 31 | T doCache(GetLocalCacheDTO cacheDTO, Cache cache, Object cacheValue); 32 | } 33 | -------------------------------------------------------------------------------- /sika-code-cache/src/main/java/com/sika/code/cache/executor/RedisCacheDefaultExecutor.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.cache.executor; 2 | 3 | import com.sika.code.cache.pojo.GetRedisCacheDTO; 4 | import com.sika.code.core.base.util.JSONUtil; 5 | import org.springframework.data.redis.core.RedisTemplate; 6 | 7 | /** 8 | *

9 | * redis缓存默认执行器 10 | *

11 | * 12 | * @author by sikadai 13 | * @version 1.0 14 | * @since 2022/8/7 17:22 15 | */ 16 | public class RedisCacheDefaultExecutor implements RedisCacheExecutor { 17 | @Override 18 | public T getCache(GetRedisCacheDTO cacheDTO, RedisTemplate redisTemplate) { 19 | return JSONUtil.parseObject((String) redisTemplate.opsForValue().get(cacheDTO.getKey()), cacheDTO.getValueClass()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /sika-code-cache/src/main/java/com/sika/code/cache/executor/RedisCacheExecutor.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.cache.executor; 2 | 3 | import com.sika.code.cache.pojo.GetRedisCacheDTO; 4 | import com.sika.code.core.base.util.JSONUtil; 5 | import org.springframework.data.redis.core.RedisTemplate; 6 | 7 | /** 8 | *

9 | * 10 | *

11 | * 12 | * @author by sikadai 13 | * @version 1.0 14 | * @since 2022/8/7 15:53 15 | */ 16 | public interface RedisCacheExecutor { 17 | /** 18 | * 从Redis中获取缓存 19 | * @param cacheDTO : 缓存数据传输对象 20 | * @param redisTemplate : redis模板 21 | * @return 缓存的值 22 | */ 23 | T getCache(GetRedisCacheDTO cacheDTO, RedisTemplate redisTemplate); 24 | 25 | /** 26 | * 将目标对象缓存到redis中 27 | * @param cacheDTO : 缓存数据传输对象 28 | * @param redisTemplate : redis模板 29 | * @param value : 缓存的值 30 | * @return 缓存的值 31 | */ 32 | default T doCache(GetRedisCacheDTO cacheDTO, RedisTemplate redisTemplate, Object value) { 33 | redisTemplate.opsForValue().set(cacheDTO.getKey(), JSONUtil.toJSONString(value)); 34 | return (T) value; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /sika-code-cache/src/main/java/com/sika/code/cache/pojo/CacheDTO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.cache.pojo; 2 | 3 | import cn.hutool.core.lang.Assert; 4 | import cn.hutool.core.text.CharSequenceUtil; 5 | import cn.hutool.core.util.IdUtil; 6 | import lombok.Data; 7 | 8 | /** 9 | *
10 |  *  缓存数据传输对象
11 |  * 
12 | * 13 | * @author daiqi 14 | * @version 1.0 15 | * @since 2022/8/5 18:12 16 | */ 17 | @Data 18 | public class CacheDTO { 19 | 20 | /** 21 | * 缓存的key 22 | */ 23 | private String key; 24 | 25 | /** 26 | * 执行的class 27 | */ 28 | private Class methodClass; 29 | /** 30 | * 方法名称 31 | */ 32 | private String methodName; 33 | /** 34 | * 方法的参数 35 | */ 36 | private Object[] methodArgs; 37 | /** 38 | * 子KEY 39 | */ 40 | private String subKey; 41 | /** 42 | * 是否已经执行方法-未执行为空 43 | */ 44 | private Boolean execute; 45 | /** 46 | * 缓存结果 47 | */ 48 | private Object cacheResult; 49 | /** 50 | * 是否开启缓存日志-默认不开启 51 | */ 52 | private Boolean openLog; 53 | /** 54 | * 是否开启缓存 - 为true开启缓存-默认开启 55 | */ 56 | private Boolean openCache; 57 | /** 58 | * 此次缓存的请求ID 59 | */ 60 | private String requestId; 61 | /** 62 | * 参数类型列表 63 | */ 64 | private Class[] paramTypes; 65 | 66 | private boolean build = false; 67 | 68 | public final void build() { 69 | if (this.build) { 70 | return; 71 | } 72 | buildData(); 73 | verifyData(); 74 | customerBuild(); 75 | build = true; 76 | } 77 | 78 | protected void customerBuild() { 79 | 80 | } 81 | 82 | protected void buildData() { 83 | if (this.openLog == null) { 84 | this.openLog = false; 85 | } 86 | if (this.openCache == null) { 87 | this.openCache = true; 88 | } 89 | if (CharSequenceUtil.isEmpty(this.requestId)) { 90 | this.requestId = IdUtil.objectId(); 91 | } 92 | } 93 | 94 | protected void verifyData() { 95 | Assert.notEmpty(key, "缓存的key不能为空"); 96 | } 97 | 98 | } 99 | -------------------------------------------------------------------------------- /sika-code-cache/src/main/java/com/sika/code/cache/pojo/ClearCacheDTO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.cache.pojo; 2 | 3 | /** 4 | *

5 | * 清除缓存 6 | *

7 | * 8 | * @author by sikadai 9 | * @version 1.0 10 | * @since 2022/8/7 16:39 11 | */ 12 | public class ClearCacheDTO extends CacheDTO { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /sika-code-cache/src/main/java/com/sika/code/cache/pojo/ClearLocalCacheDTO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.cache.pojo; 2 | 3 | import cn.hutool.core.lang.Assert; 4 | import lombok.Data; 5 | 6 | /** 7 | *

8 | * 本地缓存数据传输对象 9 | *

10 | * 11 | * @author by sikadai 12 | * @version 1.0 13 | * @since 2022/8/7 9:02 14 | */ 15 | @Data 16 | public class ClearLocalCacheDTO extends ClearCacheDTO { 17 | /** 18 | * 缓存的类型 19 | */ 20 | private String type; 21 | 22 | @Override 23 | protected void customerBuild() { 24 | Assert.notEmpty(type, "缓存的类型不能为空"); 25 | super.customerBuild(); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /sika-code-cache/src/main/java/com/sika/code/cache/pojo/ClearRedisCacheDTO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.cache.pojo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | *

7 | * Redis缓存数据传输对象 8 | *

9 | * 10 | * @author by sikadai 11 | * @version 1.0 12 | * @since 2022/8/7 9:01 13 | */ 14 | @Data 15 | public class ClearRedisCacheDTO extends ClearCacheDTO{ 16 | 17 | } 18 | -------------------------------------------------------------------------------- /sika-code-cache/src/main/java/com/sika/code/cache/pojo/GetCacheDTO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.cache.pojo; 2 | 3 | import com.sika.code.cache.constant.CacheConstant; 4 | import lombok.Data; 5 | 6 | /** 7 | *

8 | * 9 | *

10 | * 11 | * @author by sikadai 12 | * @version 1.0 13 | * @since 2022/8/7 16:39 14 | */ 15 | @Data 16 | public class GetCacheDTO extends CacheDTO { 17 | 18 | /** 19 | * 为空的时候的默认值 20 | */ 21 | private T defaultValue; 22 | /** 23 | * 缓存有效时间-单位秒 24 | */ 25 | private Long expire; 26 | 27 | @Override 28 | public void customerBuild() { 29 | if (expire == null || expire <= 0) { 30 | expire = CacheConstant.EXPIRE_DEFAULT; 31 | } 32 | super.customerBuild(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /sika-code-cache/src/main/java/com/sika/code/cache/pojo/GetLocalCacheDTO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.cache.pojo; 2 | 3 | import cn.hutool.core.lang.Assert; 4 | import com.sika.code.cache.constant.CacheConstant; 5 | import lombok.Data; 6 | 7 | /** 8 | *

9 | * 本地缓存数据传输对象 10 | *

11 | * 12 | * @author by sikadai 13 | * @version 1.0 14 | * @since 2022/8/7 9:02 15 | */ 16 | @Data 17 | public class GetLocalCacheDTO extends GetCacheDTO { 18 | /** 初始缓存大小 */ 19 | private Integer initCacheSize; 20 | /** 最大的缓存大小 */ 21 | private Integer maxCacheSize; 22 | /** 23 | * 缓存的类型 24 | */ 25 | private String type; 26 | 27 | @Override 28 | public void customerBuild() { 29 | Assert.notEmpty(type, "缓存的类型不能为空"); 30 | if (initCacheSize == null || initCacheSize <= 0) { 31 | initCacheSize = CacheConstant.INIT_CACHE_SIZE_DEFAULT; 32 | } 33 | if (maxCacheSize == null || maxCacheSize <= 0) { 34 | maxCacheSize = CacheConstant.MAX_CACHE_SIZE_DEFAULT; 35 | } 36 | super.build(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /sika-code-cache/src/main/java/com/sika/code/cache/pojo/GetRedisCacheDTO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.cache.pojo; 2 | 3 | import cn.hutool.core.lang.Assert; 4 | import lombok.Data; 5 | 6 | /** 7 | *

8 | * Redis缓存数据传输对象 9 | *

10 | * 11 | * @author by sikadai 12 | * @version 1.0 13 | * @since 2022/8/7 9:01 14 | */ 15 | @Data 16 | public class GetRedisCacheDTO extends GetCacheDTO { 17 | 18 | /** 19 | * 随机有效时间 -单位秒 20 | */ 21 | private Long randomExpire; 22 | private Class valueClass; 23 | 24 | @Override 25 | public void customerBuild() { 26 | super.build(); 27 | Assert.notNull(valueClass, "缓存中的Class对象不能为空"); 28 | if (randomExpire == null) { 29 | randomExpire = getExpire() * 2; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/application/BaseApplication.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.application; 2 | 3 | /** 4 | * 5 | * 应用层类 6 | * @author daiqi 7 | * @create 2021-10-13 0:53 8 | */ 9 | public interface BaseApplication { 10 | } 11 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/constant/BaseCodeEnum.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.constant; 2 | 3 | /** 4 | * code类型的枚举接口 5 | * @author daiqi 6 | * @create 2019-06-23 18:33 7 | */ 8 | public interface BaseCodeEnum { 9 | /** 10 | * code 11 | */ 12 | String getCode(); 13 | 14 | /** 15 | * 信息 16 | */ 17 | String getDesc(); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/constant/BaseComponentScan.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.constant; 2 | 3 | /** 4 | * 5 | *

6 | * 基础包扫描常量类 7 | *

8 | * 9 | *
10 |  *  说明:所有项目的组件扫描最终都必须继承此类
11 |  *  约定:可以提供项目的公共组件扫描类来进行统一管理
12 |  *  命名规范:通过项目+ComponentScan后缀,如类(TaobaoComponentScan)
13 |  *  使用示例:TaobaoComponentScan.COM_TAOBAO
14 |  * 
15 | * 16 | * @author daiqi 17 | * 创建时间 2018年2月6日 上午10:21:03 18 | */ 19 | public class BaseComponentScan { 20 | /** 扫描基础包名---com.meta.share */ 21 | public static final String COM_EASY_CLOUD = "com.meta.share"; 22 | } 23 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/constant/PropertiesConstant.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.constant; 2 | 3 | /** 4 | * ConfigurationProperties注解的prefix值 5 | * 6 | * @author daiqi 7 | * @create 2019-07-30 9:35 8 | */ 9 | public class PropertiesConstant { 10 | /** 11 | * 工作空间 --- meta.share.workspace 12 | */ 13 | public static final String WORKSPACE = "meta.share.workspace"; 14 | /** 15 | * 分布式锁属性前缀 --- meta.share.lock 16 | */ 17 | public static final String LOCK = "meta.share.lock"; 18 | /** 19 | * 异常前缀 --- meta.share.exception 20 | */ 21 | public static final String EXCEPTION = "meta.share.exception"; 22 | /** 23 | * sql前缀 --- meta.share.log.sql 24 | */ 25 | public static final String LOG_SQL = "meta.share.log.sql"; 26 | /** 27 | * rabbitMq发送者前缀 --- meta.share.rabbit.sender 28 | */ 29 | public static final String RABBIT_SENDER = "meta.share.rabbit.sender"; 30 | /** 31 | * restTemplate信息 --- meta.share.rest.template 32 | */ 33 | public static final String REST_TEMPLATE = "meta.share.rest.template"; 34 | /** 35 | * 消息队列发送者确认 --- meta.share.rabbit.sender.ack 36 | */ 37 | public static final String RABBIT_SENDER_ACK = "meta.share.rabbit.sender.ack"; 38 | /** 39 | * 日志controller开关 --- meta.share.log.controller.fire 40 | */ 41 | public static final String LOG_CONTROLLER_FIRE = "meta.share.log.controller.fire"; 42 | /** 43 | * jdbc开关 --- meta.share.jdbc.fire 44 | */ 45 | public static final String JDBC_FIRE = "meta.share.jdbc.fire"; 46 | /** 47 | * redis开关 --- meta.share.redis.fire 48 | */ 49 | public static final String REDIS_FIRE = "meta.share.redis.fire"; 50 | } 51 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/convert/BaseConverter.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.convert; 2 | 3 | public interface BaseConverter { 4 | } 5 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/errorcode/BaseErrorCode.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.errorcode; 2 | 3 | 4 | import com.sika.code.core.base.constant.BaseCodeEnum; 5 | 6 | /** 7 | * @author daiqi 8 | * @Description: 错误代码基类 9 | * @date 2018/3/21 21:17 10 | */ 11 | public interface BaseErrorCode extends BaseCodeEnum { 12 | String getMessage(); 13 | 14 | @Override 15 | default String getDesc() { 16 | return getMessage(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/errorcode/BaseErrorCodeEnum.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.errorcode; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * 8 | *

9 | * 错误代码常量基础类 10 | *

11 | * 12 | * @author daiqi 13 | * 创建时间 2018年2月2日 下午4:07:03 14 | */ 15 | @Getter 16 | @AllArgsConstructor 17 | public enum BaseErrorCodeEnum implements BaseErrorCode { 18 | /** 成功---BASE_000000 */ 19 | SUCCESS("BASE_000000", "成功"), 20 | /** 异常---系统错误---BASE_000001 */ 21 | SYS_ERROR("BASE_000001", "系统错误"), 22 | /** 异常---系统异常---BASE_000002 */ 23 | SYS_EXCEPTION("BASE_000002", "系统异常"), 24 | /** 异常---运行时异常---BASE_000003 */ 25 | RUNTIME_EXCEPTION("BASE_000003", "运行时异常"), 26 | /** 异常---查询对象不能为空---BASE_000004 */ 27 | QUERY_OBJ_CANT_NULL("BASE_000004", "查询对象为空"), 28 | /** 异常---持久化对象不能为空---BASE_000005 */ 29 | ENTITY_OBJ_CANT_NULL("BASE_000005", "持久化对象为空"), 30 | /** 异常---数据传输对象不能为空---BASE_000006 */ 31 | DTO_OBJ_CANT_NULL("BASE_000006", "数据传输对象为空"), 32 | /** 异常---业务逻辑对象不能为空---BASE_000007 */ 33 | BO_OBJ_CANT_NULL("BASE_000007", "业务逻辑对象为空"), 34 | /** 异常---视图对象不能为空---BASE_000008 */ 35 | VO_OBJ_CANT_NULL("BASE_000008", "视图对象为空"), 36 | /** 异常---类型转换异常---BASE_000009 */ 37 | TYPE_CONVERT_EXCEPTION("BASE_000009", "类型转换异常"), 38 | /** 异常---非法类型异常---BASE_000010 */ 39 | ILLICIT_TYPE_EXCEPTION("BASE_000010", "非法类型异常"), 40 | /** 异常---对象为空异常---BASE_000011 */ 41 | OBJECT_NULL("BASE_000011", "[{}]为空"), 42 | /** 异常---列表为空异常---BASE_000012 */ 43 | LIST_NULL("BASE_000012", "列表[{}]为空"), 44 | /** 异常---列表为空或者空列表异常---BASE_000013 */ 45 | LIST_EMPTY("BASE_000013", "列表{}]数据为空"), 46 | /** 异常---字符串为空或者空串异常---BASE_000014 */ 47 | STR_EMPTY("BASE_000014", "[{}]为空或者空串"), 48 | /** 异常---数据不存在异常---BASE_000015 */ 49 | NON_EXISTENT("BASE_000015", "[{}]不存在"), 50 | /** 异常---数据存在异常---BASE_000016 */ 51 | ALREADY_EXISTENT("BASE_000016", "[{}]已经存在"), 52 | /** 异常---数据有误异常---BASE_000017 */ 53 | DATA_ERROR("BASE_000017", "[{}]有误"), 54 | NOT_HAVE_PERMISSION("AUTHORITY_000005", "没有足够的权限"), 55 | UN_AUTH("AUTH_000001", "用户未登录或登录信息失效"), 56 | PARAM_ERROR("BASE_000018", "参数错误"), 57 | BUSINESS_EXCEPTION("BASE_100001", "业务异常"), 58 | ; 59 | 60 | private String code; 61 | private String message; 62 | } 63 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/BasePoJo.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | 8 | /** 9 | * @author daiqi 10 | * @create 2021-10-13 23:29 11 | */ 12 | @Data 13 | public abstract class BasePoJo implements Serializable { 14 | private static final long serialVersionUID = 1L; 15 | /** 16 | * 创建日期 17 | */ 18 | private Date createDate; 19 | /** 20 | * 更新日期 21 | */ 22 | private Date updateDate; 23 | /** 24 | * 版本管理标志 25 | */ 26 | private Integer version; 27 | /** 28 | * 数据版本号-若逻辑删除-则该数据与ID保持一致 29 | */ 30 | private PRIMARY dataVersion; 31 | /** 32 | * 可用标志", remark = "1:可用,0:不可用 33 | */ 34 | private Integer available; 35 | /** 36 | * 逻辑删除标志", remark = "1:删除,0:未删 37 | */ 38 | private Integer isDeleted; 39 | /** 40 | * 备注 41 | */ 42 | private String remark; 43 | 44 | public abstract PRIMARY getId() ; 45 | 46 | public abstract void setId(PRIMARY id); 47 | } 48 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/command/BaseCommand.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo.command; 2 | 3 | import com.sika.code.core.base.pojo.BasePoJo; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * 基础command 9 | * 10 | * @author daiqi 11 | * @create 2021-10-13 23:27 12 | */ 13 | public abstract class BaseCommand extends BasePoJo { 14 | protected PRIMARY id; 15 | } 16 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/context/BaseContext.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo.context; 2 | 3 | /** 4 | *

5 | * 基础实体上下文 6 | *

7 | * 8 | * @author by sikadai 9 | * @version 1.0 10 | * @since 2022/4/4 09:52 11 | */ 12 | public interface BaseContext { 13 | default void clear() { 14 | 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/domain/entity/BaseEntity.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo.domain.entity; 2 | 3 | 4 | /** 5 | *

6 | * 基础领域接口-采取上下文的方式构建请求请求响应 7 | *

8 | * 9 | * @author sikadai 10 | * @since 2021/4/4 21:26 11 | */ 12 | public interface BaseEntity { 13 | 14 | /** 15 | * 执行入口 -- 定义模板执行方式 16 | */ 17 | void execute(Context context); 18 | } 19 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/domain/entity/BaseEntityImpl.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo.domain.entity; 2 | 3 | 4 | import cn.hutool.core.util.StrUtil; 5 | import com.sika.code.core.log.util.LogUtil; 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | 9 | /** 10 | *

11 | * 基础领域接口-采取上下文的方式构建请求请求响应 12 | *

13 | * 14 | * @author sikadai 15 | * @since 2021/4/4 21:26 16 | */ 17 | public abstract class BaseEntityImpl implements BaseEntity { 18 | /** 19 | * 获取当前领域对象的日志 20 | */ 21 | protected Logger logger() { 22 | return LoggerFactory.getLogger(this.getClass()); 23 | } 24 | 25 | /** 26 | * 执行入口 -- 定义模板执行方式 27 | */ 28 | @Override 29 | public void execute(Context context) { 30 | try { 31 | executeBefore(context); 32 | if (!needExecute(context)) { 33 | return; 34 | } 35 | doExecute(context); 36 | executeAfter(context); 37 | } catch (Exception e) { 38 | loggerException(context, e); 39 | executeException(context, e); 40 | } finally { 41 | executeFinally(context); 42 | } 43 | } 44 | 45 | protected boolean needExecute(Context context) { 46 | return true; 47 | } 48 | 49 | /** 50 | * 执行前 51 | */ 52 | protected void executeBefore(Context context) { 53 | 54 | } 55 | 56 | /** 57 | * 执行者 58 | */ 59 | protected abstract void doExecute(Context context); 60 | 61 | /** 62 | * 执行后 63 | */ 64 | protected void executeAfter(Context context) { 65 | 66 | } 67 | 68 | protected void loggerException(Context context, Exception e) { 69 | LogUtil.error(StrUtil.format("领域对象【{}】执行异常", this.getClass().getName()), e, logger()); 70 | } 71 | 72 | /** 73 | * 执行异常 74 | */ 75 | protected void executeException(Context context, Exception e) { 76 | throw new RuntimeException(e); 77 | } 78 | 79 | /** 80 | * 执行最终 81 | */ 82 | protected void executeFinally(Context context) { 83 | 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/domain/entity/BaseStandardEntity.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo.domain.entity; 2 | 3 | import com.sika.code.core.base.pojo.context.BaseContext; 4 | 5 | /** 6 | * @author sikadai 7 | * @Description:基础领域实体抽象类 8 | * @date 2021/4/421:26 9 | */ 10 | public abstract class BaseStandardEntity extends BaseEntityImpl { 11 | 12 | /** 13 | * 执行最终 14 | */ 15 | @Override 16 | protected void executeFinally(Context context) { 17 | context.clear(); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/domain/factory/MetaSpringUtil.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo.domain.factory; 2 | 3 | import cn.hutool.extra.spring.SpringUtil; 4 | import org.springframework.stereotype.Component; 5 | 6 | /** 7 | * @author daiqi 8 | * @create 2021-12-03 11:01 9 | */ 10 | @Component 11 | public class MetaSpringUtil extends SpringUtil { 12 | } 13 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/domain/valueobject/BaseValueObject.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo.domain.valueobject; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author daiqi 7 | * @create 2021-10-13 0:44 8 | */ 9 | @Data 10 | public class BaseValueObject { 11 | } 12 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/dto/BaseDTO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo.dto; 2 | 3 | import com.sika.code.core.base.pojo.BasePoJo; 4 | import lombok.Data; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * 基础数据传输对象 10 | * 11 | * @author daiqi 12 | * @create 2021-10-13 23:27 13 | */ 14 | @Data 15 | public abstract class BaseDTO extends BasePoJo { 16 | protected PRIMARY id; 17 | } 18 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/dto/BaseMsgDTO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo.dto; 2 | 3 | 4 | import com.sika.code.core.base.errorcode.BaseErrorCode; 5 | import com.sika.code.core.base.errorcode.BaseErrorCodeEnum; 6 | import com.sika.code.core.base.util.JSONUtil; 7 | import lombok.Data; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * 所有消息的数据传输对象 13 | * 14 | * @author daiqi 15 | * @create 2019-06-29 23:17 16 | */ 17 | @Data 18 | public class BaseMsgDTO { 19 | /** 20 | * 结果码 21 | */ 22 | protected String code; 23 | 24 | /** 25 | * 描述 26 | */ 27 | protected String message; 28 | 29 | /** 30 | * 是否成功 31 | */ 32 | protected Boolean success; 33 | /** 34 | * 消息编号 35 | */ 36 | protected String msgNo; 37 | /** 38 | * 数据 39 | */ 40 | protected Object data; 41 | 42 | public BaseMsgDTO() { 43 | 44 | } 45 | 46 | public BaseMsgDTO(Object data) { 47 | init(data, BaseErrorCodeEnum.SUCCESS); 48 | } 49 | 50 | public BaseMsgDTO(Object data, BaseErrorCode errorCode) { 51 | init(data, errorCode); 52 | } 53 | 54 | /** 55 | *

56 | * 创建MqDTO对象 57 | *

58 | * 59 | * @param data : 具体数据 60 | * @param errorCode : 错误枚举类 61 | * @return com.meta.share.mq.common.pojo.MsgDTO 62 | * @author daiqi 63 | * @date 2019/6/29 21:54 64 | */ 65 | 66 | public void init(Object data, BaseErrorCode errorCode) { 67 | boolean success = false; 68 | if (BaseErrorCodeEnum.SUCCESS.equals(errorCode)) { 69 | success = true; 70 | } 71 | setCode(errorCode.getCode()); 72 | setMessage(errorCode.getDesc()); 73 | setSuccess(success); 74 | setData(data); 75 | } 76 | 77 | /** 78 | *

79 | * 将data转化为class对应的对象 80 | *

81 | * 82 | * @param tClass 83 | * @return T 84 | * @author daiqi 85 | * @date 2019/6/29 21:48 86 | */ 87 | public T parseObject(Class tClass) { 88 | return JSONUtil.parseObject(this.getData(), tClass); 89 | } 90 | 91 | /** 92 | *

93 | * 将data转化为class对应的数组 94 | *

95 | * 96 | * @param tClass 97 | * @return T 98 | * @author daiqi 99 | * @date 2019/6/29 21:48 100 | */ 101 | public List parseArray(Class tClass) { 102 | return JSONUtil.parseArray(this.getData(), tClass); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/po/BasePO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo.po; 2 | 3 | import com.sika.code.core.base.pojo.BasePoJo; 4 | import lombok.Data; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * 基础持久化类 10 | * 11 | * @author daiqi 12 | * @create 2021-10-13 0:42 13 | */ 14 | @Data 15 | public abstract class BasePO extends BasePoJo { 16 | } 17 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/query/BaseQuery.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo.query; 2 | 3 | import com.sika.code.core.base.pojo.BasePoJo; 4 | import lombok.Data; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * 基础查询对象 10 | * 11 | * @author daiqi 12 | * 创建日期 2018年1月6日 下午3:43:09 13 | */ 14 | @Data 15 | public abstract class BaseQuery extends BasePoJo { 16 | protected PRIMARY id; 17 | } 18 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/query/Page.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo.query; 2 | 3 | import lombok.Data; 4 | import org.springframework.util.Assert; 5 | 6 | import java.io.Serializable; 7 | import java.util.List; 8 | 9 | /** 10 | * User : sikadai 11 | * Date : 2017/1/13 12 | * Time : 18:36 13 | */ 14 | @Data 15 | public class Page implements Serializable { 16 | 17 | private static final long serialVersionUID = 34234234234985L; 18 | /** 19 | * 数据总数 20 | */ 21 | private int total; 22 | /** 23 | * 每页的数量 24 | */ 25 | private int pageSize; 26 | /** 27 | * 页面的总数 28 | */ 29 | private int pageCount; 30 | /** 31 | * 当前页面编号 32 | */ 33 | private int pageNum; 34 | /** 35 | * 当前数据 36 | */ 37 | private int currentSize; 38 | private boolean isHasNextPage; 39 | private boolean isHasPreviousPage; 40 | private List records; 41 | 42 | 43 | public Page() { 44 | super(); 45 | } 46 | 47 | public Page(Integer pageNum, Integer pageSize, Integer total, List list) { 48 | pageSize = 0 == pageSize ? null : pageSize; 49 | Assert.notNull(pageNum, "pageNum"); 50 | Assert.notNull(pageSize, "pageSize"); 51 | Assert.notNull(total, "total"); 52 | this.pageNum = pageNum; 53 | this.pageSize = pageSize; 54 | this.total = total; 55 | if (this.total == 0) { 56 | this.pageCount = 0; 57 | } else { 58 | int i = total % pageSize; 59 | int count = total / pageSize; 60 | this.pageCount = i == 0 ? count : count + 1; 61 | } 62 | if (list == null) { 63 | this.currentSize = 0; 64 | } else { 65 | this.currentSize = list.size(); 66 | } 67 | this.records = list; 68 | this.isHasPreviousPage = pageNum != 1; 69 | this.isHasNextPage = pageNum < pageCount; 70 | } 71 | 72 | public Page(PageQuery pageQuery, Integer total, List list) { 73 | this(pageQuery.getPageNum(), pageQuery.getPageSize(), total, list); 74 | } 75 | 76 | public Page(Page page, List list) { 77 | this(page.getPageNum(), page.getPageSize(), page.getTotal(), list); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/query/PageQuery.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo.query; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * User : sikadai 9 | * Date : 2017/1/23 10 | * Time : 13:17 11 | */ 12 | @Data 13 | public class PageQuery extends BaseQuery { 14 | private Integer pageNum; 15 | private Integer pageSize; 16 | private Integer start; 17 | private String sortColumn; 18 | private String sortType; 19 | private Long startIndex; 20 | 21 | public PageQuery() { 22 | super(); 23 | this.pageNum = (this.pageNum == null || this.pageNum <= 0) ? 1 : this.pageNum; 24 | this.pageSize = (this.pageSize == null || this.pageSize <= 0) ? 10 : this.pageSize; 25 | } 26 | 27 | public Integer getStart() { 28 | if (pageNum == 1) { 29 | return 0; 30 | } else { 31 | return (pageNum - 1) * pageSize; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/query/SortType.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo.query; 2 | 3 | /** 4 | * 数据排序类型 5 | * @author daiqi 6 | * @create 2019-03-22 16:21 7 | */ 8 | public class SortType { 9 | /** 数据排序类型 --- 升序 --- ASC */ 10 | public static final String ASC = "ASC"; 11 | /** 数据排序类型 --- 降序 --- DESC */ 12 | public static final String DESC = "DESC"; 13 | } 14 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/pojo/vo/BaseVO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.pojo.vo; 2 | 3 | import com.sika.code.core.base.pojo.BasePoJo; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * 基础视图对象Vo 9 | * 10 | * @author daiqi 11 | */ 12 | public abstract class BaseVO extends BasePoJo { 13 | protected PRIMARY id; 14 | } 15 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/test/BaseTest.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.test; 2 | 3 | import cn.hutool.core.date.StopWatch; 4 | import lombok.Data; 5 | import org.junit.After; 6 | import org.junit.Before; 7 | import org.junit.Rule; 8 | import org.junit.rules.TestName; 9 | import org.junit.runner.RunWith; 10 | import org.slf4j.Logger; 11 | import org.slf4j.LoggerFactory; 12 | import org.springframework.boot.test.context.SpringBootTest; 13 | import org.springframework.test.context.junit4.SpringRunner; 14 | 15 | import java.lang.reflect.Method; 16 | import java.util.concurrent.TimeUnit; 17 | 18 | @SpringBootTest 19 | @RunWith(SpringRunner.class) 20 | @Data 21 | public class BaseTest { 22 | protected Logger log = LoggerFactory.getLogger(this.getClass()); 23 | protected StopWatch stopWatch = new StopWatch(this.getClass().getSimpleName() + "-单元测试"); 24 | @Rule 25 | public TestName testName = new TestName(); 26 | 27 | @Before 28 | public void testBegin() throws NoSuchMethodException { 29 | stopWatch.start(); 30 | Method m = getClass().getMethod(testName.getMethodName()); 31 | log.info("方法[{}]开始执行单元测试", m.getName()); 32 | } 33 | 34 | @After 35 | public void testEnd() throws NoSuchMethodException { 36 | Method m = getClass().getMethod(testName.getMethodName()); 37 | stopWatch.stop(); 38 | log.info("方法[{}]结束执行单元测试,执行统计详情\n{}", m.getName(), stopWatch.prettyPrint(TimeUnit.MILLISECONDS)); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/test/BaseTestEntity.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.test; 2 | 3 | public class BaseTestEntity extends BaseTest { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/test/BaseTestRepository.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.test; 2 | 3 | public class BaseTestRepository extends BaseTest { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/test/BaseTestService.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.test; 2 | 3 | public class BaseTestService extends BaseTest { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/base/util/ScReflectUtil.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.base.util; 2 | 3 | import cn.hutool.core.util.ReflectUtil; 4 | import org.springframework.core.GenericTypeResolver; 5 | import org.springframework.util.ClassUtils; 6 | 7 | /** 8 | *
 9 |  *  ak的反射工具类
10 |  * 
11 | * 12 | * @author daiqi 13 | * @version 1.0 14 | * @since 2022/5/31 11:27 15 | */ 16 | public class ScReflectUtil extends ReflectUtil { 17 | 18 | /** 19 | *

20 | * 反射对象获取泛型 21 | *

22 | * 23 | * @param clazz 对象 24 | * @param genericIfc 所属泛型父类 25 | * @param index 泛型所在位置 26 | * @return Class 27 | */ 28 | public static Class getSuperClassGenericType(final Class clazz, final Class genericIfc, final int index) { 29 | //update by noear @2021-09-03 30 | Class[] typeArguments = resolveTypeArguments(ClassUtils.getUserClass(clazz), genericIfc); 31 | return null == typeArguments ? null : typeArguments[index]; 32 | } 33 | 34 | /** 35 | * 获取泛型工具助手 36 | */ 37 | public static Class[] resolveTypeArguments(final Class clazz, final Class genericIfc) { 38 | // 直接使用 spring 静态方法,减少对象创建 39 | return GenericTypeResolver.resolveTypeArguments(clazz, genericIfc); 40 | } 41 | 42 | 43 | } 44 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/exception/config/ExceptionConfig.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.exception.config; 2 | 3 | import com.sika.code.core.exception.properties.ExceptionProperties; 4 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | /** 9 | * @author daiqi 10 | * @create 2019-03-22 17:31 11 | */ 12 | @Configuration 13 | public class ExceptionConfig { 14 | @Bean 15 | @ConditionalOnMissingBean 16 | public ExceptionProperties exceptionProperties() { 17 | return new ExceptionProperties(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/exception/dto/BaseBusinessExceptionDTO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.exception.dto; 2 | 3 | import cn.hutool.core.date.DateUtil; 4 | import com.sika.code.core.informer.BaseInformer; 5 | import lombok.Data; 6 | 7 | import java.util.Date; 8 | import java.util.List; 9 | 10 | /** 11 | *

12 | * 基础服务异常结果类 13 | *

14 | * 15 | * @author daiqi 16 | * 创建时间 2018年2月2日 下午7:24:48 17 | */ 18 | @Data 19 | public class BaseBusinessExceptionDTO { 20 | private Date timestamp; 21 | private String timestampStr; 22 | private String exception; 23 | private String path; 24 | private String failureDetails; 25 | private BaseInformer exceptionInformer; 26 | 27 | private List exceptionInformers; 28 | 29 | public static BaseBusinessExceptionDTO newInstance() { 30 | return new BaseBusinessExceptionDTO(); 31 | } 32 | 33 | /** 34 | *

35 | * 根据异常构建数据 36 | *

37 | * 38 | * @param path 39 | * @param exception 40 | * @param failureDetail 41 | * @return BaseBusinessExceptionDTO 42 | * @author daiqi 43 | * @date 2019/7/3 22:40 44 | */ 45 | public BaseBusinessExceptionDTO build(String path, Exception exception, boolean failureDetail) { 46 | this.setException(exception.getClass().getName()); 47 | if (failureDetail) { 48 | this.setFailureDetails(exception.getMessage()); 49 | } 50 | this.setTimestamp(DateUtil.date()); 51 | this.setPath(path); 52 | return this; 53 | } 54 | 55 | public void setTimestamp(Date timestamp) { 56 | this.timestamp = timestamp; 57 | this.timestampStr = DateUtil.formatDateTime(timestamp); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/exception/properties/ExceptionProperties.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.exception.properties; 2 | 3 | import cn.hutool.core.collection.CollUtil; 4 | import com.sika.code.core.base.errorcode.BaseErrorCode; 5 | import lombok.Data; 6 | 7 | import java.util.LinkedHashMap; 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | /** 12 | * @author daiqi 13 | * @create 2019-03-22 17:30 14 | */ 15 | @Data 16 | public class ExceptionProperties { 17 | /** 18 | * 是否是排除模式 若exclude为true则为排除模式 needExcludeInformCodes生效否则为包含模式needInformCodes生效 19 | * 默认为包含模式 即不设置exclude将采取包含模式 20 | */ 21 | private Boolean exclude; 22 | 23 | /** 24 | * 需要通知的错误码 25 | */ 26 | private Map needInformCodesMap = new LinkedHashMap<>(); 27 | /** 28 | * 需要排除通知的错误码 29 | */ 30 | private Map needExcludeInformCodesMap = new LinkedHashMap<>(); 31 | 32 | public ExceptionProperties buildNeedInformCodes(List needInformErrorCodes) { 33 | if (CollUtil.isEmpty(needInformErrorCodes)) { 34 | return this; 35 | } 36 | buildInformCodesMap(needInformCodesMap, needInformErrorCodes); 37 | return this; 38 | } 39 | 40 | public ExceptionProperties buildNeedExcludeInformCodes(List needExcludeInformErrorCodes) { 41 | if (CollUtil.isEmpty(needExcludeInformErrorCodes)) { 42 | return this; 43 | } 44 | buildInformCodesMap(this.needExcludeInformCodesMap, needExcludeInformErrorCodes); 45 | return this; 46 | } 47 | 48 | private void buildInformCodesMap(Map informCodesMap, List informCodes) { 49 | if (CollUtil.isEmpty(informCodes)) { 50 | return; 51 | } 52 | for (BaseErrorCode needInformCode : informCodes) { 53 | informCodesMap.put(needInformCode.getCode(), needInformCode); 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/informer/BaseInformer.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.informer; 2 | 3 | import com.sika.code.core.informer.dto.BaseThirdMessageDTO; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | 7 | /** 8 | *

9 | * 基础异常通知者 10 | *

11 | *
12 |  * 所有异常通知需要继承该基础异常通知类并重写notice方法
13 |  * 所有实现该接口的类命名方式为 ExceptionInformerFor...
14 |  * 如 ExceptionInformerForLog
15 |  * 
16 | * 17 | * @author daiqi 18 | * @create 2018-07-31 11:35 19 | */ 20 | public abstract class BaseInformer { 21 | protected Logger logger = LoggerFactory.getLogger(this.getClass()); 22 | 23 | /** 24 | * 通知 25 | */ 26 | public boolean inform(String message) { 27 | return doInform(message); 28 | } 29 | 30 | /** 31 | *

32 | * 执行通知 33 | *

34 | * 35 | * @param message 36 | * @return boolean 37 | * @author daiqi 38 | * @date 2018/7/31 12:34 39 | */ 40 | protected abstract boolean doInform(String message); 41 | 42 | public boolean inform(BaseThirdMessageDTO baseThirdMessageDTO, String webhook) { 43 | return true; 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/informer/config/InformerConfig.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.informer.config; 2 | 3 | import cn.hutool.core.collection.CollUtil; 4 | import com.sika.code.core.informer.BaseInformer; 5 | import com.sika.code.core.informer.impl.InformerForLog; 6 | import com.sika.code.core.informer.properties.InformerProperties; 7 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 8 | import org.springframework.context.annotation.Bean; 9 | import org.springframework.context.annotation.Configuration; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * 通知器配置类 15 | * 16 | * @author daiqi 17 | * @create 2019-04-12 11:47 18 | */ 19 | @Configuration 20 | public class InformerConfig { 21 | 22 | @Bean 23 | @ConditionalOnMissingBean 24 | public InformerProperties informerProperties() { 25 | List exceptionInformers = CollUtil.newArrayList(new InformerForLog()); 26 | InformerProperties informerProperties = new InformerProperties(); 27 | informerProperties.setExceptionInformers(exceptionInformers); 28 | return informerProperties; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/informer/constant/MsgTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.informer.constant; 2 | 3 | import com.sika.code.core.base.constant.BaseCodeEnum; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | 7 | /** 8 | * @author daiqi 9 | * @create 2020-05-15 17:13 10 | */ 11 | @AllArgsConstructor 12 | @Getter 13 | public enum MsgTypeEnum implements BaseCodeEnum { 14 | TEXT("text", "文本消息"), 15 | MARKDOWN("markdown", "Markdown消息"), 16 | ; 17 | private String code; 18 | private String desc; 19 | } 20 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/informer/dto/BaseThirdMessageDTO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.informer.dto; 2 | 3 | import com.google.common.collect.Maps; 4 | 5 | import java.util.Map; 6 | 7 | /** 8 | * @author daiqi 9 | * @create 2020-05-15 15:10 10 | */ 11 | public interface BaseThirdMessageDTO { 12 | default Map getSendMsg(){ 13 | return Maps.newHashMap(); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/informer/impl/InformerForLog.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.informer.impl; 2 | 3 | import com.sika.code.core.informer.BaseInformer; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | 7 | /** 8 | * 异常通知者---使用log方式 9 | * 10 | * @author daiqi 11 | * @create 2018-07-31 11:37 12 | */ 13 | public class InformerForLog extends BaseInformer { 14 | private final Logger logger = LoggerFactory.getLogger(this.getClass()); 15 | 16 | @Override 17 | public boolean doInform(String message) { 18 | logger.error(message); 19 | return true; 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/informer/properties/InformerProperties.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.informer.properties; 2 | 3 | import com.sika.code.core.informer.BaseInformer; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * @author daiqi 10 | * @create 2019-04-12 10:28 11 | */ 12 | @Data 13 | public class InformerProperties { 14 | private List exceptionInformers; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/informer/util/InformerUtil.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.informer.util; 2 | 3 | import cn.hutool.core.collection.CollUtil; 4 | import cn.hutool.core.exceptions.ExceptionUtil; 5 | import cn.hutool.core.util.ObjectUtil; 6 | import com.sika.code.core.exception.BusinessException; 7 | import com.sika.code.core.informer.BaseInformer; 8 | import com.sika.code.core.log.util.LogUtil; 9 | import com.google.common.collect.Lists; 10 | import org.slf4j.Logger; 11 | 12 | import java.util.List; 13 | 14 | /** 15 | * @author daiqi 16 | * @create 2019-06-30 0:40 17 | */ 18 | public class InformerUtil { 19 | 20 | public static void inform(Exception exception, BaseInformer informer, Logger logger) { 21 | inform(exception, Lists.newArrayList(informer), logger); 22 | } 23 | 24 | /** 25 | * 通知 26 | */ 27 | public static void inform(Exception exception, List informersDefault, Logger logger) { 28 | try { 29 | if (ObjectUtil.isNull(exception)) { 30 | LogUtil.error("异常通知", "businessExceptionDTO为空", logger); 31 | return; 32 | } 33 | logger.error(exception.getMessage(), exception); 34 | List informers = null; 35 | if (exception instanceof BusinessException) { 36 | informers = ((BusinessException) exception).getInformers(); 37 | } 38 | if (CollUtil.isEmpty(informers)) { 39 | informers = informersDefault; 40 | } 41 | if (CollUtil.isEmpty(informers)) { 42 | return; 43 | } 44 | String exceptionDetail = ExceptionUtil.stacktraceToString(exception); 45 | informers.stream() 46 | .filter(ObjectUtil::isNotNull) 47 | .forEach(informer -> informer.inform(exceptionDetail)); 48 | } catch (Exception e) { 49 | logger.error(e.getMessage(), e); 50 | } 51 | 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/log/config/TraceIdGenerator.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.log.config; 2 | 3 | import com.sika.code.core.log.util.LogUtil; 4 | import com.yomahub.tlog.id.TLogIdGenerator; 5 | 6 | /** 7 | * @author daiqi 8 | * @create 2021-11-27 1:38 9 | */ 10 | public class TraceIdGenerator extends TLogIdGenerator { 11 | @Override 12 | public String generateTraceId() { 13 | return LogUtil.createTraceId(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/result/Result.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.result; 2 | 3 | 4 | import com.sika.code.core.base.errorcode.BaseErrorCode; 5 | import com.sika.code.core.base.errorcode.BaseErrorCodeEnum; 6 | import com.sika.code.core.base.pojo.dto.BaseMsgDTO; 7 | import com.sika.code.core.base.pojo.dto.ServiceResult; 8 | import com.sika.code.core.log.util.LogUtil; 9 | import lombok.Data; 10 | 11 | import java.io.Serializable; 12 | 13 | /** 14 | *

15 | * 封装统一的返回结果 16 | *

17 | * 18 | * @author daiqi 19 | * @date 2019/5/24 23:48 20 | */ 21 | @Data 22 | public class Result extends BaseMsgDTO implements Serializable { 23 | 24 | private static final long serialVersionUID = -1L; 25 | 26 | public Result() { 27 | 28 | } 29 | 30 | private Result(String code, String message) { 31 | this.code = code; 32 | this.message = message; 33 | } 34 | 35 | private Result(String code, String message, Object data) { 36 | this.code = code; 37 | this.message = message; 38 | this.data = data; 39 | } 40 | 41 | 42 | private Result(Object data) { 43 | super(data); 44 | } 45 | 46 | private Result(Object data, BaseErrorCode errorCode) { 47 | super(data, errorCode); 48 | } 49 | 50 | /** 51 | *

52 | * 若匹配的是Object对象则默认是成功的 53 | *

54 | * 55 | * @param data : 需要封装的数据 56 | * @return Result 57 | * @author daiqi 58 | * @date 2019/5/9 20:39 59 | */ 60 | public static Result newInstance(Object data) { 61 | if (data instanceof ServiceResult) { 62 | ServiceResult result = (ServiceResult) data; 63 | if (result.getSuccess()) { 64 | return new Result(result.getResult()); 65 | } else { 66 | return new Result(result.getCode(), result.getMessage(), result.getResult()); 67 | } 68 | } 69 | Result result = new Result(data); 70 | result.setMsgNo(LogUtil.getTraceId()); 71 | return result; 72 | } 73 | 74 | public static Result newError(String message) { 75 | Result result = new Result(); 76 | result.setCode(BaseErrorCodeEnum.SYS_ERROR.getCode()); 77 | result.setMessage(message); 78 | result.setSuccess(false); 79 | result.setMsgNo(LogUtil.getTraceId()); 80 | return result; 81 | } 82 | 83 | } -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/result/config/ResultConfig.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.result.config; 2 | 3 | import com.sika.code.core.result.generator.ResultGenerator; 4 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | /** 9 | * @author daiqi 10 | * @create 2019-07-03 21:29 11 | */ 12 | @Configuration 13 | public class ResultConfig { 14 | 15 | @Bean 16 | @ConditionalOnMissingBean 17 | public ResultGenerator resultGenerator() { 18 | return new ResultGenerator(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /sika-code-core/src/main/java/com/sika/code/core/util/IdUtil.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.core.util; 2 | 3 | import cn.hutool.core.lang.SimpleCache; 4 | import cn.hutool.core.lang.Snowflake; 5 | 6 | import java.util.HashMap; 7 | 8 | /** 9 | *

10 | * 拓展hutool的工具类 11 | *

12 | * 13 | * @author by sikadai 14 | * @version 1.0 15 | * @since 2022/9/10 10:24 16 | */ 17 | public class IdUtil extends cn.hutool.core.util.IdUtil { 18 | 19 | private static final SimpleCache, Snowflake> POOL = new SimpleCache<>(new HashMap<>()); 20 | 21 | /** 22 | *

23 | * 根据实体的类名-生成对应的雪花算法对象-避免共用雪花对象 24 | *

25 | * 26 | * @param tClazz 27 | * @return cn.hutool.core.lang.Snowflake 28 | * @author sikadai 29 | * @since 2022/9/4 20:59 30 | */ 31 | public static Snowflake getSnowflake(Class tClazz) { 32 | if (tClazz == null) { 33 | return getSnowflake(); 34 | } 35 | Snowflake snowflakeFromCache = POOL.get(tClazz); 36 | if (snowflakeFromCache != null) { 37 | return snowflakeFromCache; 38 | } 39 | snowflakeFromCache = new Snowflake(); 40 | POOL.put(tClazz, snowflakeFromCache); 41 | return snowflakeFromCache; 42 | } 43 | 44 | /** 45 | *

46 | * 根据实体的类名-生成对应的雪花算法对象-避免共用雪花对象-生成雪花ID 47 | *

48 | * 49 | * @param tClazz 50 | * @return cn.hutool.core.lang.Snowflake 51 | * @author sikadai 52 | * @since 2022/9/4 20:59 53 | */ 54 | public static Long nextId(Class tClazz) { 55 | return getSnowflake(tClazz).nextId(); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /sika-code-core/src/test/java/test.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sika-code-cloud/sika-code/01878ca6812db11c0511614bba1c4fca1bcfb4f9/sika-code-core/src/test/java/test.txt -------------------------------------------------------------------------------- /sika-code-db-sharding/.flattened-pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | io.github.sika-code-cloud 7 | sika-code 8 | 3.1.2 9 | 10 | io.github.sika-code-cloud 11 | sika-code-db-sharding 12 | 3.1.2 13 | 14 | 15 | MIT License 16 | http://www.opensource.org/licenses/mit-license.php 17 | 18 | 19 | 20 | 8 21 | 8 22 | 23 | 24 | 25 | io.github.sika-code-cloud 26 | sika-code-db 27 | ${revision} 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /sika-code-db-sharding/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | sika-code 7 | io.github.sika-code-cloud 8 | ${revision} 9 | 10 | 4.0.0 11 | 12 | sika-code-db-sharding 13 | 14 | 15 | 8 16 | 8 17 | 18 | 19 | 20 | io.github.sika-code-cloud 21 | sika-code-db 22 | ${revision} 23 | 24 | 25 | -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/annotation/ShardingRule.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.annotation; 2 | 3 | 4 | 5 | import com.sika.code.db.sharding.config.ShardingRuleConfig; 6 | 7 | import java.lang.annotation.ElementType; 8 | import java.lang.annotation.Retention; 9 | import java.lang.annotation.RetentionPolicy; 10 | import java.lang.annotation.Target; 11 | 12 | /** 13 | * 分表规则注解 14 | * 15 | * @author sikadai 16 | */ 17 | @Retention(RetentionPolicy.RUNTIME) 18 | @Target({ElementType.TYPE}) 19 | public @interface ShardingRule { 20 | 21 | /** 22 | * 规则配置 23 | */ 24 | Class shardingRuleConfigClass(); 25 | 26 | /** 27 | * 规则名称 28 | */ 29 | String ruleName(); 30 | } -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/config/ShardingConfigure.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.config; 2 | 3 | import com.sika.code.db.sharding.executor.DefaultShardingExecutor; 4 | import com.sika.code.db.sharding.executor.ShardingExecutor; 5 | import com.sika.code.db.sharding.manager.ShardingStrategyManager; 6 | import com.sika.code.db.sharding.plugin.ShardingInterceptor; 7 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 8 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 9 | import org.springframework.context.annotation.Bean; 10 | import org.springframework.context.annotation.Configuration; 11 | 12 | /** 13 | *
14 |  *  分片的配置类
15 |  * 
16 | * 17 | * @author daiqi 18 | * @version 1.0 19 | * @since 2022/7/9 15:23 20 | */ 21 | @ConditionalOnProperty( 22 | prefix = "spring.sharding", 23 | name = {"enabled"}, 24 | havingValue = "true", 25 | matchIfMissing = false 26 | ) 27 | @Configuration 28 | public class ShardingConfigure { 29 | 30 | @Bean 31 | public ShardingStrategyManager shardingConfiguration() { 32 | return new ShardingStrategyManager(); 33 | } 34 | 35 | @Bean 36 | @ConditionalOnMissingBean 37 | public ShardingExecutor shardingExecutor(ShardingStrategyManager shardingStrategyManager) { 38 | DefaultShardingExecutor shardingExecutor = new DefaultShardingExecutor(); 39 | shardingExecutor.setShardingStrategyManager(shardingStrategyManager); 40 | return shardingExecutor; 41 | } 42 | 43 | @Bean 44 | @ConditionalOnMissingBean 45 | public ShardingInterceptor shardingInterceptor(ShardingExecutor shardingExecutor) { 46 | ShardingInterceptor shardingInterceptor = new ShardingInterceptor(); 47 | shardingInterceptor.setShardingExecutor(shardingExecutor); 48 | return shardingInterceptor; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/config/ShardingRuleConfig.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.config; 2 | 3 | import com.sika.code.db.sharding.strategy.Strategy; 4 | 5 | /** 6 | *

7 | * 分片规则配置-可以基于枚举+配置 8 | *

9 | * 10 | * @author by sikadai 11 | * @version 1.0 12 | * @since 2022/7/3 11:38 13 | */ 14 | public interface ShardingRuleConfig { 15 | 16 | /** 17 | * 指定数据库的格式 18 | */ 19 | String getDbName(); 20 | 21 | /** 22 | * 指定表名的格式 23 | */ 24 | String getTableName(); 25 | 26 | /** 27 | * 获取数据库分片的KEY 28 | */ 29 | String getDbShardingKey(); 30 | 31 | /** 32 | * 获取表分片的KEY 33 | */ 34 | String getTableShardingKey(); 35 | 36 | /** 37 | *

38 | * 分片策略的Class 39 | *

40 | * @author sikadai 41 | * @since 2022/7/9 15:10 42 | * @return java.lang.Class 43 | */ 44 | Class getStrategyClass(); 45 | 46 | /** 47 | *

48 | * 分片标志 - 配置为false则代表不分片 49 | *

50 | * @author sikadai 51 | * @since 2022/7/9 15:10 52 | * @return java.lang.Boolean 53 | */ 54 | Boolean getSharingFlag(); 55 | } 56 | -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/executor/DefaultShardingExecutor.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.executor; 2 | 3 | import com.sika.code.core.util.EnumUtil; 4 | import com.sika.code.db.sharding.annotation.ShardingRule; 5 | import com.sika.code.db.sharding.config.ShardingRuleConfig; 6 | import lombok.extern.slf4j.Slf4j; 7 | 8 | /** 9 | *
10 |  *  默认-分片执行器
11 |  * 
12 | * 13 | * @author daiqi 14 | * @version 1.0 15 | * @since 2022/7/9 15:42 16 | */ 17 | @Slf4j 18 | public class DefaultShardingExecutor extends ShardingExecutor { 19 | 20 | @Override 21 | protected ShardingRuleConfig getShardingRuleConfig(ShardingRule shardingRule) { 22 | return EnumUtil.find(shardingRule.shardingRuleConfigClass(), RULE_CONFIG_ENUM_NAME, shardingRule.ruleName()); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/generator/builder/SqlGeneratorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.generator.builder; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.sika.code.db.sharding.generator.dto.SqlGeneratorDTO; 5 | 6 | import java.util.Locale; 7 | 8 | /** 9 | *

10 | * sql脚本生构建器 11 | *

12 | * 13 | * @author by sikadai 14 | * @version 1.0 15 | * @since 2022/7/10 19:41 16 | */ 17 | public class SqlGeneratorBuilder { 18 | private final static String CREATE_DATABASE = "CREATE DATABASE"; 19 | private final static String ALTER_DATABASE = "ALTER DATABASE"; 20 | private final static String CREATE_TABLE = "CREATE TABLE"; 21 | private final static String ALTER_TABLE = "ALTER TABLE"; 22 | public void build(SqlGeneratorDTO dto) { 23 | String toUpperCase = dto.getSourceLine().toUpperCase(Locale.ROOT); 24 | String resultLine = dto.getSourceLine(); 25 | if (StrUtil.startWith(toUpperCase, CREATE_DATABASE)) { 26 | 27 | } else if (StrUtil.startWith(toUpperCase, ALTER_DATABASE)) { 28 | 29 | } else if (StrUtil.startWith(toUpperCase, CREATE_TABLE)) { 30 | 31 | } else if (StrUtil.startWith(toUpperCase, ALTER_TABLE)) { 32 | 33 | } 34 | dto.setResultLine(resultLine); 35 | } 36 | 37 | protected String buildResultLine(SqlGeneratorDTO dto, String toUpperCase) { 38 | Integer shardingType = dto.getShardingType(); 39 | String resultLine = dto.getSourceLine(); 40 | if (shardingType.equals(1)) { 41 | // 年库天表 42 | } else if (shardingType.equals(2)) { 43 | // 年库月表 44 | } else if (shardingType.equals(3)) { 45 | // 年表 46 | } else if (shardingType.equals(4)) { 47 | // 数据递增表-如百库十表-十库百表 48 | } 49 | return resultLine; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/generator/dto/SqlGeneratorDTO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.generator.dto; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | *

7 | * 脚本生成器数据传输对象 8 | *

9 | * 10 | * @author by sikadai 11 | * @version 1.0 12 | * @since 2022/7/10 19:43 13 | */ 14 | @Data 15 | public class SqlGeneratorDTO { 16 | private String dbName; 17 | private String tableName; 18 | private String dbNum; 19 | private String tableNum; 20 | private Integer shardingType; 21 | 22 | private String sourceLine; 23 | private String resultLine; 24 | private String currentDbIndex; 25 | private String currentTableIndex; 26 | } 27 | -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/generator/executor/SqlGeneratorExecutor.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.generator.executor; 2 | 3 | /** 4 | *

5 | * sql脚本生成器命令器 6 | *

7 | * 8 | * @author by sikadai 9 | * @version 1.0 10 | * @since 2022/7/10 19:53 11 | */ 12 | public class SqlGeneratorExecutor { 13 | } 14 | -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/manager/ShardingStrategyManager.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.manager; 2 | 3 | 4 | import com.sika.code.core.util.BeanUtil; 5 | import com.sika.code.db.sharding.strategy.Strategy; 6 | import lombok.extern.slf4j.Slf4j; 7 | 8 | import java.util.Map; 9 | import java.util.concurrent.ConcurrentHashMap; 10 | 11 | /*** 12 | *

13 | * 分片策略管理器 14 | *

15 | * @author sikadai 16 | * @since 2022/7/9 15:06 17 | */ 18 | @Slf4j 19 | public class ShardingStrategyManager { 20 | private final Map, Strategy> strategies = new ConcurrentHashMap<>(16); 21 | 22 | /** 23 | * 向管理器中添加策略 24 | * 25 | * @param strategyClassName 26 | * @param strategy 27 | */ 28 | public void addStrategy(Class strategyClassName, Strategy strategy) { 29 | strategies.put(strategyClassName, strategy); 30 | } 31 | 32 | /** 33 | *

34 | * 获取擦略类 35 | *

36 | * 37 | * @param strategyClassName : 策略类名称 38 | * @return com.ak.cloud.standard.frame.db.sharing.strategy.Strategy 39 | * @author sikadai 40 | * @since 2022/7/9 15:15 41 | */ 42 | public Strategy getStrategy(Class strategyClassName) { 43 | Strategy strategyFromCache = strategies.get(strategyClassName); 44 | if (strategyFromCache == null) { 45 | addStrategy(strategyClassName, BeanUtil.getBean(strategyClassName)); 46 | } 47 | return strategies.get(strategyClassName); 48 | } 49 | 50 | public Map, Strategy> getStrategies() { 51 | return strategies; 52 | } 53 | 54 | public void setStrategies(Map, String> strategies) { 55 | for (Map.Entry, String> entry : strategies.entrySet()) { 56 | addStrategy(entry.getKey(), BeanUtil.getBean(entry.getKey())); 57 | } 58 | } 59 | 60 | } -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/plugin/ShardingInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.plugin; 2 | 3 | import com.sika.code.db.sharding.context.ShardingContext; 4 | import com.sika.code.db.sharding.executor.ShardingExecutor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.apache.ibatis.executor.statement.StatementHandler; 7 | import org.apache.ibatis.plugin.*; 8 | import org.apache.ibatis.reflection.DefaultReflectorFactory; 9 | import org.apache.ibatis.reflection.MetaObject; 10 | import org.apache.ibatis.reflection.SystemMetaObject; 11 | 12 | import java.sql.Connection; 13 | import java.util.Properties; 14 | 15 | /** 16 | * @author :sikadai 17 | * @description: 18 | * @date :2019/6/14 10:10 19 | */ 20 | @Slf4j(topic = "策略分库分表拦截器【ShardingInterceptor】") 21 | @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})}) 22 | public class ShardingInterceptor implements Interceptor { 23 | 24 | private static final String PARAMETER_OBJECT = "delegate.boundSql.parameterObject"; 25 | private ShardingExecutor shardingExecutor; 26 | 27 | @Override 28 | public Object intercept(Invocation invocation) throws Throwable { 29 | try { 30 | // log.info("进入分库分表拦截器:===================="); 31 | StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); 32 | MetaObject metaStatementHandler = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory()); 33 | Object parameterObject = metaStatementHandler.getValue(PARAMETER_OBJECT); 34 | getShardingExecutor().doShardingDbTable(metaStatementHandler, parameterObject); 35 | // log.info("完成分库分表拦截器:===================="); 36 | // 传递给下一个拦截器处理 37 | return invocation.proceed(); 38 | } finally { 39 | if (ShardingContext.isAutoClearFlag()) { 40 | ShardingContext.remove(); 41 | } 42 | } 43 | } 44 | 45 | @Override 46 | public Object plugin(Object arg0) { 47 | if (arg0 instanceof StatementHandler) { 48 | return Plugin.wrap(arg0, this); 49 | } else { 50 | return arg0; 51 | } 52 | } 53 | 54 | @Override 55 | public void setProperties(Properties arg0) { 56 | 57 | } 58 | 59 | public void setShardingExecutor(ShardingExecutor shardingExecutor) { 60 | this.shardingExecutor = shardingExecutor; 61 | } 62 | 63 | protected ShardingExecutor getShardingExecutor() { 64 | return this.shardingExecutor; 65 | } 66 | } -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/strategy/Strategy.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.strategy; 2 | 3 | import com.sika.code.db.sharding.util.ShardingUtil; 4 | 5 | /** 6 | * 分表策略服务接口 7 | * 8 | * @author sikadai 9 | */ 10 | public interface Strategy { 11 | 12 | /** 13 | *

14 | * 返回完整的表名-数据库.表名 15 | *

16 | * 17 | * @param dbName : 数据库名称 18 | * @param shardingDbValue : 分片库的值 19 | * @param tableName : 表名 20 | * @param shardingTableValue : 分片表的值 21 | * @return java.lang.String 22 | * @author sikadai 23 | * @since 2022/7/9 15:07 24 | */ 25 | default String returnDbTableName(String dbName, Object shardingDbValue, String tableName, Object shardingTableValue) { 26 | String shardDbName = returnDbName(dbName, shardingDbValue); 27 | String shardTableName = returnTableName(tableName, shardingTableValue); 28 | return ShardingUtil.buildShardingDbTableName(dbName, shardDbName, tableName, shardTableName); 29 | } 30 | 31 | /** 32 | *

33 | * 返回分片的库名 34 | *

35 | * 36 | * @param dbName : 数据库名称 37 | * @param shardingDbValue : 分片库的值 38 | * @return java.lang.String 39 | * @author sikadai 40 | * @since 2022/7/9 15:07 41 | */ 42 | String returnDbName(String dbName, Object shardingDbValue); 43 | 44 | /** 45 | *

46 | * 返回分片的表名 47 | *

48 | * 49 | * @param tableName : 表名 50 | * @param shardingTableValue : 分片表的值 51 | * @return java.lang.String 52 | * @author sikadai 53 | * @since 2022/7/9 15:07 54 | */ 55 | String returnTableName(String tableName, Object shardingTableValue); 56 | 57 | } -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/strategy/xxyy/BaseXxYyStrategy.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.strategy.xxyy; 2 | 3 | import cn.hutool.core.text.CharSequenceUtil; 4 | import cn.hutool.core.text.StrPool; 5 | import com.sika.code.db.sharding.strategy.Strategy; 6 | import com.sika.code.db.sharding.util.ShardingUtil; 7 | 8 | /** 9 | *

10 | * 继承该类的分库分表策略需要为2的倍数 11 | *

12 | * 13 | * @author sikadai 14 | * @since 2022/9/16 16:29 15 | */ 16 | public abstract class BaseXxYyStrategy implements Strategy { 17 | 18 | @Override 19 | public String returnDbName(String dbName, Object shardingDbValue) { 20 | return getDbOrTableName(dbName, shardingDbValue, getDbNum(), false); 21 | } 22 | 23 | 24 | @Override 25 | public String returnTableName(String tableName, Object shardingTableValue) { 26 | return getDbOrTableName(tableName, shardingTableValue, getTableNum(), true); 27 | } 28 | 29 | /** 30 | * 获取数据库分库的数量 31 | */ 32 | protected abstract Integer getDbNum(); 33 | 34 | /** 35 | * 获取数据库表分表的数量 36 | */ 37 | protected abstract Integer getTableNum(); 38 | 39 | protected String getDbOrTableName(String name, Object shardingValue, Integer dbOrTableNum, boolean table) { 40 | /** 如果分库或分表的数量为空或者小于等于0则直接返回 */ 41 | if (dbOrTableNum == null || dbOrTableNum <= 0) { 42 | return name; 43 | } 44 | int dbTemValue = ShardingUtil.getXxYyValue(shardingValue, dbOrTableNum, table); 45 | return CharSequenceUtil.join(StrPool.UNDERLINE, name, dbTemValue); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/strategy/xxyy/EightDbEightTableStrategy.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.strategy.xxyy; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | /** 6 | *

7 | * 8库*8表分库分表策略 8 | *

9 | * 10 | * @author sikadai 11 | * @return 12 | * @since 2022/9/16 16:18 13 | */ 14 | @Component 15 | public class EightDbEightTableStrategy extends BaseXxYyStrategy { 16 | private static final Integer EIGHT = 8; 17 | @Override 18 | protected Integer getDbNum() { 19 | return EIGHT; 20 | } 21 | 22 | @Override 23 | protected Integer getTableNum() { 24 | return EIGHT; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/strategy/xxyy/SixteenDbSixteenTableStrategy.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.strategy.xxyy; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | /** 6 | *

7 | * 16库*16表分库分表策略 8 | *

9 | * 10 | * @author sikadai 11 | * @return 12 | * @since 2022/9/16 16:18 13 | */ 14 | @Component 15 | public class SixteenDbSixteenTableStrategy extends BaseXxYyStrategy { 16 | private static final Integer SIXTEEN = 16; 17 | @Override 18 | protected Integer getDbNum() { 19 | return SIXTEEN; 20 | } 21 | 22 | @Override 23 | protected Integer getTableNum() { 24 | return SIXTEEN; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/strategy/xxyy/ThirtyTwoDbThirtyTwoTableStrategy.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.strategy.xxyy; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | /** 6 | *

7 | * 32库32表分库分表策略 8 | *

9 | * 10 | * @author sikadai 11 | * @return 12 | * @since 2022/9/16 16:18 13 | */ 14 | @Component 15 | public class ThirtyTwoDbThirtyTwoTableStrategy extends BaseXxYyStrategy { 16 | protected static final Integer THIRD_TWR = 32; 17 | @Override 18 | protected Integer getDbNum() { 19 | return THIRD_TWR; 20 | } 21 | 22 | @Override 23 | protected Integer getTableNum() { 24 | return THIRD_TWR; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/strategy/year/BaseYearXxStrategy.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.strategy.year; 2 | 3 | import cn.hutool.core.text.CharSequenceUtil; 4 | import cn.hutool.core.text.StrPool; 5 | import com.sika.code.db.sharding.strategy.Strategy; 6 | import com.sika.code.db.sharding.util.ShardingUtil; 7 | 8 | /** 9 | *

10 | * 基础按照年xx分库分表策略 11 | *

12 | * 13 | * @author sikadai 14 | * @since 2022/9/16 17:35 15 | */ 16 | public abstract class BaseYearXxStrategy implements Strategy { 17 | protected static final String YYYY = "yyyy"; 18 | protected static final String YYYY_MM = "yyyyMM"; 19 | protected static final String YYYY_MM_DD = "yyyyMMdd"; 20 | 21 | @Override 22 | public String returnDbName(String dbName, Object shardingDbValue) { 23 | String dbTemValue = ShardingUtil.formatDate(shardingDbValue, YYYY); 24 | return CharSequenceUtil.join(StrPool.UNDERLINE, dbName, dbTemValue); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/strategy/year/YearDayStrategy.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.strategy.year; 2 | 3 | import cn.hutool.core.text.CharSequenceUtil; 4 | import cn.hutool.core.text.StrPool; 5 | import com.sika.code.db.sharding.util.ShardingUtil; 6 | import org.springframework.stereotype.Component; 7 | 8 | /** 9 | *

10 | * 年库天表分库分表策略 11 | *

12 | * 13 | * @author sikadai 14 | * @return 15 | * @since 2022/9/16 16:18 16 | */ 17 | @Component 18 | public class YearDayStrategy extends BaseYearXxStrategy { 19 | 20 | @Override 21 | public String returnTableName(String tableName, Object shardingTableValue) { 22 | String tableTemValue = ShardingUtil.formatDate(shardingTableValue, YYYY_MM_DD); 23 | return CharSequenceUtil.join(StrPool.UNDERLINE, tableName, tableTemValue); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/strategy/year/YearMonthStrategy.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.strategy.year; 2 | 3 | import cn.hutool.core.text.CharSequenceUtil; 4 | import cn.hutool.core.text.StrPool; 5 | import com.sika.code.db.sharding.util.ShardingUtil; 6 | import org.springframework.stereotype.Component; 7 | 8 | /** 9 | *

10 | * 年库月表分库分表策略 11 | *

12 | * 13 | * @author sikadai 14 | * @return 15 | * @since 2022/9/16 16:18 16 | */ 17 | @Component 18 | public class YearMonthStrategy extends BaseYearXxStrategy { 19 | 20 | @Override 21 | public String returnTableName(String tableName, Object shardingTableValue) { 22 | String tableTemValue = ShardingUtil.formatDate(shardingTableValue, YYYY_MM); 23 | return CharSequenceUtil.join(StrPool.UNDERLINE, tableName, tableTemValue); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/java/com/sika/code/db/sharding/strategy/year/YearSevenDayStrategy.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.sharding.strategy.year; 2 | 3 | import cn.hutool.core.text.CharSequenceUtil; 4 | import cn.hutool.core.text.StrPool; 5 | import com.sika.code.db.sharding.util.ShardingUtil; 6 | import org.springframework.stereotype.Component; 7 | 8 | /** 9 | *

10 | * 年库周表分库分表策略 11 | *

12 | * 13 | * @author sikadai 14 | * @return 15 | * @since 2022/9/16 16:18 16 | */ 17 | @Component 18 | public class YearSevenDayStrategy extends BaseYearXxStrategy { 19 | 20 | @Override 21 | public String returnTableName(String tableName, Object shardingTableValue) { 22 | int tableTemValue = ShardingUtil.sevenDayOfYear(shardingTableValue); 23 | return CharSequenceUtil.join(StrPool.UNDERLINE, tableName, tableTemValue); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/resources/db/create_db_demo.sql: -------------------------------------------------------------------------------- 1 | create database temp_db_{} DEFAULT CHARACTER SET utf8mb4; -------------------------------------------------------------------------------- /sika-code-db-sharding/src/main/resources/db/create_table_demo.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE temp_db_{}.temp_table_{} ( 2 | `id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'ID-雪花算法生成-不参与任务业务关联', 3 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试表'; -------------------------------------------------------------------------------- /sika-code-db/.flattened-pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | io.github.sika-code-cloud 7 | sika-code 8 | 3.1.2 9 | 10 | io.github.sika-code-cloud 11 | sika-code-db 12 | 3.1.2 13 | 14 | 15 | MIT License 16 | http://www.opensource.org/licenses/mit-license.php 17 | 18 | 19 | 20 | 8 21 | 8 22 | 23 | 24 | 25 | io.github.sika-code-cloud 26 | sika-code-core 27 | ${revision} 28 | 29 | 30 | com.baomidou 31 | mybatis-plus-boot-starter 32 | ${mybatis-plus-boot-starter.version} 33 | 34 | 35 | org.springframework.boot 36 | spring-boot-starter-jdbc 37 | 38 | 39 | tomcat-jdbc 40 | org.apache.tomcat 41 | 42 | 43 | spring-boot-starter-logging 44 | org.springframework.boot 45 | 46 | 47 | 48 | 49 | mysql 50 | mysql-connector-java 51 | 52 | 53 | com.zaxxer 54 | HikariCP 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /sika-code-db/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | sika-code 7 | io.github.sika-code-cloud 8 | ${revision} 9 | 10 | 4.0.0 11 | 12 | sika-code-db 13 | 14 | 15 | 8 16 | 8 17 | 18 | 19 | 20 | io.github.sika-code-cloud 21 | sika-code-core 22 | ${revision} 23 | 24 | 25 | 26 | com.baomidou 27 | mybatis-plus-boot-starter 28 | ${mybatis-plus-boot-starter.version} 29 | 30 | 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-starter-jdbc 35 | 36 | 37 | org.apache.tomcat 38 | tomcat-jdbc 39 | 40 | 41 | org.springframework.boot 42 | spring-boot-starter-logging 43 | 44 | 45 | 46 | 47 | 48 | mysql 49 | mysql-connector-java 50 | 51 | 52 | com.zaxxer 53 | HikariCP 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /sika-code-db/src/main/java/com/sika/code/db/constant/DbConstant.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.constant; 2 | 3 | /** 4 | *

5 | * 6 | *

7 | * 8 | * @author by sikadai 9 | * @version 1.0 10 | * @since 2022/11/11 10:52 11 | */ 12 | public class DbConstant { 13 | 14 | public static final String SET_VERSION_SQL = "version = version + 1"; 15 | public static final String LOGIC_DELETED_SQL = "is_deleted = 1"; 16 | public static final String IS_DELETED_KEY = "is_deleted"; 17 | } 18 | -------------------------------------------------------------------------------- /sika-code-db/src/main/java/com/sika/code/db/injector/config/CustomizedSqlInjector.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.injector.config; 2 | 3 | import com.baomidou.mybatisplus.core.injector.AbstractMethod; 4 | import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; 5 | import com.baomidou.mybatisplus.core.metadata.TableInfo; 6 | import com.sika.code.db.injector.method.LogicDeleteMethod; 7 | import com.sika.code.db.injector.method.UpdateBatchMethod; 8 | 9 | import java.util.List; 10 | 11 | public class CustomizedSqlInjector extends DefaultSqlInjector { 12 | /** 13 | * 如果只需增加方法,保留mybatis plus自带方法, 14 | * 可以先获取super.getMethodList(),再添加add 15 | */ 16 | @Override 17 | public List getMethodList(Class mapperClass, TableInfo tableInfo) { 18 | List methodList = super.getMethodList(mapperClass, tableInfo); 19 | methodList.add(new UpdateBatchMethod()); 20 | methodList.add(new LogicDeleteMethod()); 21 | return methodList; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /sika-code-db/src/main/java/com/sika/code/db/injector/config/MyBatisPlusConfig.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.injector.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | 6 | @Configuration 7 | public class MyBatisPlusConfig { 8 | @Bean 9 | public CustomizedSqlInjector customizedSqlInjector() { 10 | return new CustomizedSqlInjector(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /sika-code-db/src/main/java/com/sika/code/db/injector/method/LogicDeleteMethod.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.db.injector.method; 2 | 3 | import com.baomidou.mybatisplus.core.injector.AbstractMethod; 4 | import com.baomidou.mybatisplus.core.metadata.TableInfo; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.apache.ibatis.mapping.MappedStatement; 7 | import org.apache.ibatis.mapping.SqlSource; 8 | 9 | import static com.baomidou.mybatisplus.core.enums.SqlMethod.LOGIC_DELETE; 10 | 11 | /** 12 | * 批量更新方法实现,条件为主键,选择性更新 13 | */ 14 | @Slf4j 15 | public class LogicDeleteMethod extends AbstractMethod { 16 | @Override 17 | public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { 18 | String set = "SET data_version = " + tableInfo.getKeyColumn() + ", is_deleted = 1, version = version + 1"; 19 | String sql = String.format(LOGIC_DELETE.getSql(), tableInfo.getTableName(), set, 20 | sqlWhereEntityWrapper(true, tableInfo), 21 | sqlComment()); 22 | SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); 23 | return addUpdateMappedStatement(mapperClass, modelClass, "logicDelete", sqlSource); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /sika-code-db/src/main/java/com/sika/code/db/po/BasePoAuto.java: -------------------------------------------------------------------------------- 1 | 2 | package com.sika.code.db.po; 3 | 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.sika.code.core.base.pojo.po.BasePO; 7 | import lombok.Data; 8 | 9 | import java.io.Serializable; 10 | 11 | @Data 12 | public class BasePoAuto extends BasePO { 13 | @TableId( 14 | type = IdType.AUTO 15 | ) 16 | protected PRIMARY id; 17 | } 18 | -------------------------------------------------------------------------------- /sika-code-db/src/main/java/com/sika/code/db/po/BasePoNone.java: -------------------------------------------------------------------------------- 1 | 2 | package com.sika.code.db.po; 3 | 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.sika.code.core.base.pojo.po.BasePO; 7 | import lombok.Data; 8 | 9 | import java.io.Serializable; 10 | 11 | @Data 12 | public class BasePoNone extends BasePO { 13 | @TableId( 14 | type = IdType.NONE 15 | ) 16 | protected PRIMARY id; 17 | } 18 | -------------------------------------------------------------------------------- /sika-code-db/src/test/java/test.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sika-code-cloud/sika-code/01878ca6812db11c0511614bba1c4fca1bcfb4f9/sika-code-db/src/test/java/test.txt -------------------------------------------------------------------------------- /sika-code-generator/.flattened-pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | io.github.sika-code-cloud 7 | sika-code 8 | 3.1.2 9 | 10 | io.github.sika-code-cloud 11 | sika-code-generator 12 | 3.1.2 13 | 14 | 15 | MIT License 16 | http://www.opensource.org/licenses/mit-license.php 17 | 18 | 19 | 20 | 3.5.1 21 | 22 | 23 | 24 | com.baomidou 25 | mybatis-plus-generator 26 | ${mybatis-plus-generator.version} 27 | 28 | 29 | org.apache.velocity 30 | velocity 31 | 1.7 32 | 33 | 34 | mysql 35 | mysql-connector-java 36 | 37 | 38 | io.github.sika-code-cloud 39 | sika-code-core 40 | ${revision} 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /sika-code-generator/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | sika-code 7 | io.github.sika-code-cloud 8 | ${revision} 9 | 10 | 4.0.0 11 | 12 | sika-code-generator 13 | 14 | 3.5.1 15 | 16 | 17 | 18 | 19 | 20 | com.baomidou 21 | mybatis-plus-generator 22 | ${mybatis-plus-generator.version} 23 | 24 | 25 | 26 | org.apache.velocity 27 | velocity 28 | 1.7 29 | 30 | 31 | mysql 32 | mysql-connector-java 33 | 34 | 35 | 36 | io.github.sika-code-cloud 37 | sika-code-core 38 | ${revision} 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/java/com/sika/code/generator/constant/GenerratorClassEnum.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.generator.constant; 2 | 3 | import com.sika.code.core.base.constant.BaseTypeEnum; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | 7 | /** 8 | * 代码生成器的类型 9 | * 10 | * @author daiqi 11 | * @create 2021-11-30 0:31 12 | */ 13 | @AllArgsConstructor 14 | @Getter 15 | public enum GenerratorClassEnum implements BaseTypeEnum { 16 | /** 基础设施类 */ 17 | PO(101, "持久化类"), 18 | DOT(102, "DTO类"), 19 | QUERY(103, "查询类"), 20 | VALUE_OBJECT(104, "值类"), 21 | CONVERT(105, "转化类"), 22 | /** 基础设施DB类 */ 23 | MAPPER(201, "mybatis映射类"), 24 | XML(202, "XML类"), 25 | /** 领域类 */ 26 | REPOSITORY(301, "持久化类"), 27 | ENTITY(302, "实体类"), 28 | FACTORY(303, "工厂类"), 29 | AGGREGATE_ROOT(304, "聚合根类"), 30 | /** 应用类 */ 31 | SERVICE_APPLICATION(404, "应用服务类"), 32 | /** 接口类 */ 33 | CONTROLLER(501, "rest控制器类"), 34 | RPC_API(502, "RPC接口类"), 35 | RPC_IMP(503, "RPC实现类"); 36 | 37 | 38 | private final Integer type; 39 | private final String desc; 40 | 41 | @Override 42 | public Integer getType() { 43 | return type; 44 | } 45 | 46 | @Override 47 | public String getDesc() { 48 | return desc; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/java/com/sika/code/generator/dto/GeneratorClientDTO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.generator.dto; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | @Data 8 | public class GeneratorClientDTO { 9 | private String author; 10 | 11 | private List tableNames; 12 | private String tablePrefix; 13 | 14 | private String projectPrefix; 15 | private String modulePackagePrefix; 16 | 17 | private String ip; 18 | private Integer port; 19 | private String dbName; 20 | private String dbPassword; 21 | private String dbUsername; 22 | 23 | private boolean generateDomain = true; 24 | private boolean generateController = true; 25 | 26 | private String applicationClassName; 27 | private String applicationSimpleName; 28 | } -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/aggregateRoot.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | 3 | /** 4 | *

5 | * ${table.comment!} 聚合根 6 | *

7 | * 8 | * @author ${author} 9 | * @since ${date} 10 | */ 11 | public class ${entity} { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/apiService.java.ftl: -------------------------------------------------------------------------------- 1 | package ${sikaPackage.ApiService}; 2 | 3 | import ${sikaPackage.DTO}.${sikaEntityBodyName}DTO; 4 | import com.cat.reconciliation.platform.infrastructure.interfaces.rpc.base.BaseApiService; 5 | 6 | /** 7 | *

8 | * ${table.comment!} API服务类 9 | *

10 | * 11 | * @author ${author} 12 | * @since ${date} 13 | */ 14 | public interface ${sikaEntityBodyName}ApiService extends BaseApiService<${sikaPrimaryType}, ${sikaEntityBodyName}DTO> { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/apiServiceImpl.java.ftl: -------------------------------------------------------------------------------- 1 | package ${sikaPackage.ApiServiceImpl}; 2 | 3 | import ${sikaPackage.DTO}.${sikaEntityBodyName}DTO; 4 | import ${sikaPackage.Service}.${sikaEntityBodyName}Service; 5 | import ${sikaPackage.ApiService}.${sikaEntityBodyName}ApiService; 6 | import com.cat.reconciliation.platform.infrastructure.interfaces.rpc.base.BaseApiServiceImpl; 7 | import org.apache.dubbo.config.annotation.DubboService; 8 | 9 | /** 10 | *

11 | * ${table.comment!} API服务实现类 12 | *

13 | * 14 | * @author ${author} 15 | * @since ${date} 16 | */ 17 | @DubboService 18 | public class ${sikaEntityBodyName}ApiServiceImpl extends BaseApiServiceImpl<${sikaPrimaryType}, ${sikaEntityBodyName}DTO, ${sikaEntityBodyName}Service> implements ${sikaEntityBodyName}ApiService { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/command.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | 3 | import com.sika.code.core.base.pojo.command.BaseCommand; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | /** 7 | *

8 | * ${table.comment!} 更新命令类 9 | *

10 | * 11 | * @author ${author} 12 | * @since ${date} 13 | */ 14 | @Getter 15 | @Setter 16 | public class ${entity} extends BaseCommand<${sikaPrimaryType}> { 17 | private static final long serialVersionUID = 1L; 18 | } 19 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/context.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | 3 | /** 4 | *

5 | * ${table.comment!}上下文类 6 | *

7 | * 8 | * @author ${author} 9 | * @since ${date} 10 | */ 11 | public class ${entity} { 12 | 13 | } -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/controller.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | 3 | 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | 6 | import com.sika.code.core.result.Result; 7 | import ${sikaPackage.Query}.${sikaEntityBodyName}Query; 8 | import ${sikaPackage.DTO}.${sikaEntityBodyName}DTO; 9 | 10 | import ${sikaPackage.Service}.${sikaEntityBodyName}Service; 11 | import com.cat.reconciliation.platform.interfaces.common.controller.BaseLiteflowServerController; 12 | import javax.annotation.Resource; 13 | import org.springframework.web.bind.annotation.RequestBody; 14 | import java.util.List; 15 | import org.springframework.web.bind.annotation.RestController; 16 | 17 | /** 18 | *

19 | * ${table.comment!} 前端控制器 20 | *

21 | * 22 | * @author ${author} 23 | * @since ${date} 24 | */ 25 | @RestController 26 | @RequestMapping("${sikaEntityBodyName?uncap_first}") 27 | public class ${entity} extends BaseLiteflowServerController { 28 | 29 | @Resource 30 | private ${sikaEntityBodyName}Service ${sikaEntityBodyName?uncap_first}Service; 31 | 32 | @RequestMapping(value = "save") 33 | public Result save(@RequestBody ${sikaEntityBodyName}DTO dto) { 34 | return success(${sikaEntityBodyName?uncap_first}Service.save(dto)); 35 | } 36 | 37 | 38 | @RequestMapping(value = "saveBatch") 39 | public Result saveBatch(@RequestBody List<${sikaEntityBodyName}DTO> dtos) { 40 | return success(${sikaEntityBodyName?uncap_first}Service.saveBatch(dtos)); 41 | } 42 | 43 | @RequestMapping(value = "page") 44 | public Result page(@RequestBody ${sikaEntityBodyName}Query query) { 45 | return success(${sikaEntityBodyName?uncap_first}Service.page(query)); 46 | } 47 | 48 | @RequestMapping(value = "find") 49 | public Result find(@RequestBody ${sikaEntityBodyName}Query query) { 50 | return success(${sikaEntityBodyName?uncap_first}Service.find(query)); 51 | } 52 | 53 | @RequestMapping(value = "list") 54 | public Result list(@RequestBody ${sikaEntityBodyName}Query query) { 55 | return success(${sikaEntityBodyName?uncap_first}Service.list(query)); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/converter.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | import com.sika.code.core.base.convert.BaseConverter; 3 | import ${sikaPackage.DTO}.${sikaEntityBodyName}DTO; 4 | import ${sikaPackage.PO}.${sikaEntityBodyName}PO; 5 | import org.mapstruct.Mapper; 6 | import org.mapstruct.ReportingPolicy; 7 | import org.mapstruct.factory.Mappers; 8 | import java.util.List; 9 | 10 | /** 11 | *

12 | * ${table.comment!} 转化类 13 | *

14 | * 15 | * @author ${author} 16 | * @since ${date} 17 | */ 18 | @Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE) 19 | public interface ${entity} extends BaseConverter { 20 | /** 21 | *

22 | * 转化类的单例对象 23 | *

24 | */ 25 | ${sikaEntityBodyName}Converter INSTANCE = Mappers.getMapper(${sikaEntityBodyName}Converter.class); 26 | 27 | /** 28 | * 将DTO对象转化为PO对象 29 | */ 30 | ${sikaEntityBodyName}PO convertToPo(${sikaEntityBodyName}DTO dto); 31 | 32 | /** 33 | * 将PO对象转化为DTO对象 34 | */ 35 | ${sikaEntityBodyName}DTO convertToDto(${sikaEntityBodyName}PO po); 36 | 37 | /** 38 | * 将DTO对象列表转化为PO对象列表 39 | */ 40 | List<${sikaEntityBodyName}PO> convertToPos(List<${sikaEntityBodyName}DTO> dtos); 41 | 42 | /** 43 | * 将PO对象列表转化为DTO对象列表 44 | */ 45 | List<${sikaEntityBodyName}DTO> convertToDtos(List<${sikaEntityBodyName}PO> pos); 46 | 47 | } 48 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/dto.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | 3 | import com.sika.code.core.base.pojo.dto.BaseDTO; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | /** 7 | *

8 | * ${table.comment!} 更新命令类 9 | *

10 | * 11 | * @author ${author} 12 | * @since ${date} 13 | */ 14 | @Getter 15 | @Setter 16 | public class ${entity} extends BaseDTO<${sikaPrimaryType}> { 17 | private static final long serialVersionUID = 1L; 18 | <#-- ---------- BEGIN 字段循环遍历 ----------> 19 | <#list table.fields as field> 20 | <#if field.comment!?length gt 0> 21 | /** 22 | * ${field.comment} 23 | */ 24 | 25 | private ${field.propertyType} ${field.propertyName}; 26 | 27 | <#------------ END 字段循环遍历 ----------> 28 | } 29 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/entity.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | 3 | 4 | import com.sika.code.core.base.pojo.domain.entity.BaseStandardEntity; 5 | import com.sika.code.core.base.pojo.context.BaseContext; 6 | 7 | /** 8 | *

9 | * ${table.comment!}领域类 10 | *

11 | * 12 | * @author ${author} 13 | * @since ${date} 14 | */ 15 | public abstract class ${entity} extends BaseStandardEntity { 16 | 17 | } -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/entity.test.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | 3 | 4 | import ${sikaPackage.DTO}.${sikaEntityBodyName}DTO; 5 | import com.sika.code.core.base.test.BaseTestEntity; 6 | 7 | /** 8 | *

9 | * ${table.comment!}领域测试类 10 | *

11 | * 12 | * @author ${author} 13 | * @since ${date} 14 | */ 15 | public class ${entity} extends BaseTestEntity { 16 | 17 | } -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/factory.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | 3 | /** 4 | *

5 | * ${table.comment!}工厂类 6 | *

7 | * 8 | * @author ${author} 9 | * @since ${date} 10 | */ 11 | public class ${entity} { 12 | 13 | } -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/mapper.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | 3 | import ${sikaPackage.Entity}.${sikaEntityBodyName}PO; 4 | import com.sika.code.db.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * ${table.comment!} Mapper 接口 9 | *

10 | * 11 | * @author ${author} 12 | * @since ${date} 13 | */ 14 | public interface ${entity} extends BaseMapper<${sikaEntityBodyName}PO${r","} ${sikaPrimaryType}> { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/po.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | 3 | import com.sika.code.core.base.pojo.po.BasePO; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | /** 8 | *

9 | * ${table.comment!} 持久化类 10 | *

11 | * 12 | * @author ${author} 13 | * @since ${date} 14 | */ 15 | @Getter 16 | @Setter 17 | @TableName("${table.name}") 18 | public class ${entity} extends BasePO<${sikaPrimaryType}> { 19 | private static final long serialVersionUID = 1L; 20 | <#-- ---------- BEGIN 字段循环遍历 ----------> 21 | <#list table.fields as field> 22 | <#if field.comment!?length gt 0> 23 | /** 24 | * ${field.comment} 25 | */ 26 | 27 | private ${field.propertyType} ${field.propertyName}; 28 | 29 | <#------------ END 字段循环遍历 ----------> 30 | } 31 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/query.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | 3 | import com.sika.code.core.base.pojo.query.PageQuery; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import java.util.List; 7 | 8 | /** 9 | *

10 | * ${table.comment!} 查询类 11 | *

12 | * 13 | * @author ${author} 14 | * @since ${date} 15 | */ 16 | @Getter 17 | @Setter 18 | public class ${entity} extends PageQuery<${sikaPrimaryType}> { 19 | private static final long serialVersionUID = 1L; 20 | <#-- ---------- BEGIN 字段循环遍历 ----------> 21 | <#list table.fields as field> 22 | <#if field.comment!?length gt 0> 23 | /** 24 | * ${field.comment} 25 | */ 26 | 27 | private ${field.propertyType} ${field.propertyName}; 28 | 29 | private List<${sikaPrimaryType}> ids; 30 | <#------------ END 字段循环遍历 ----------> 31 | } 32 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/repository.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | 3 | import ${sikaPackage.Entity}.${sikaEntityBodyName}PO; 4 | import com.sika.code.core.base.repository.BaseRepository; 5 | 6 | /** 7 | *

8 | * ${table.comment!} 持久化操作类 9 | *

10 | * 11 | * @author ${author} 12 | * @since ${date} 13 | */ 14 | public interface ${entity} extends BaseRepository<${sikaEntityBodyName}PO${r","} ${sikaPrimaryType}> { 15 | /** 16 | * 校验ID对应的协作器是否不存在-不存在抛出异常 17 | * @param id : 主键ID 18 | */ 19 | void verify${sikaEntityBodyName}UnExistById(${sikaPrimaryType} id); 20 | } 21 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/repositoryImpl.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | 3 | import ${sikaPackage.Entity}.${sikaEntityBodyName}PO; 4 | import ${sikaPackage.Mapper}.${sikaEntityBodyName}Mapper; 5 | import ${sikaPackage.Repository}.${sikaEntityBodyName}Repository; 6 | import com.sika.code.db.repository.impl.BaseRepositoryMyBatisPlusImpl; 7 | import org.springframework.stereotype.Repository; 8 | import cn.hutool.core.lang.Assert; 9 | 10 | /** 11 | *

12 | * ${table.comment!} 持久化操作实现类 13 | *

14 | * 15 | * @author ${author} 16 | * @since ${date} 17 | */ 18 | @Repository 19 | public class ${entity} extends BaseRepositoryMyBatisPlusImpl<${sikaEntityBodyName}PO${r","} ${sikaPrimaryType}, ${sikaEntityBodyName}Mapper> implements ${sikaEntityBodyName}Repository { 20 | 21 | @Override 22 | public void verify${sikaEntityBodyName}UnExistById(${sikaPrimaryType} id) { 23 | Assert.notNull(id, "${table.comment!}主键ID不能为空"); 24 | ${sikaEntityBodyName}PO po = findByPrimaryKey(id); 25 | Assert.notNull(po, "主键【{}】对应的${table.comment!}数据不存在,请核实", id); 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/rpc.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Controller}; 2 | 3 | /** 4 | *

5 | * ${table.comment!} RPC类 6 | *

7 | * 8 | * @author ${author} 9 | * @since ${date} 10 | */ 11 | public class ${table.controllerName} { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/service.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | 3 | import ${sikaPackage.DTO}.${sikaEntityBodyName}DTO; 4 | import com.sika.code.core.base.service.BaseService; 5 | 6 | /** 7 | *

8 | * ${table.comment!} 服务类 9 | *

10 | * 11 | * @author ${author} 12 | * @since ${date} 13 | */ 14 | public interface ${entity} extends BaseService<${sikaPrimaryType}, ${sikaEntityBodyName}DTO> { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/serviceImpl.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | 3 | import ${sikaPackage.DTO}.${sikaEntityBodyName}DTO; 4 | import ${sikaPackage.PO}.${sikaEntityBodyName}PO; 5 | import ${sikaPackage.Repository}.${sikaEntityBodyName}Repository; 6 | import ${sikaPackage.Service}.${sikaEntityBodyName}Service; 7 | import com.sika.code.core.base.service.BaseServiceImpl; 8 | import org.springframework.stereotype.Service; 9 | 10 | /** 11 | *

12 | * ${table.comment!} 服务实现类 13 | *

14 | * 15 | * @author ${author} 16 | * @since ${date} 17 | */ 18 | @Service 19 | public class ${entity} extends BaseServiceImpl<${sikaPrimaryType}, ${sikaEntityBodyName}PO, ${sikaEntityBodyName}DTO, ${sikaEntityBodyName}Repository> implements ${sikaEntityBodyName}Service { 20 | 21 | } 22 | -------------------------------------------------------------------------------- /sika-code-generator/src/main/resources/template/valueObject.java.ftl: -------------------------------------------------------------------------------- 1 | package ${package.Entity}; 2 | import lombok.Getter; 3 | import lombok.Setter; 4 | 5 | /** 6 | *

7 | * ${table.comment!} 值对象类 8 | *

9 | * 10 | * @author ${author} 11 | * @since ${date} 12 | */ 13 | @Getter 14 | @Setter 15 | public class ${entity} { 16 | private static final long serialVersionUID = 1L; 17 | } 18 | -------------------------------------------------------------------------------- /sika-code-generator/src/test/java/test.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sika-code-cloud/sika-code/01878ca6812db11c0511614bba1c4fca1bcfb4f9/sika-code-generator/src/test/java/test.txt -------------------------------------------------------------------------------- /sika-code-job/.flattened-pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | io.github.sika-code-cloud 7 | sika-code 8 | 3.1.2 9 | 10 | io.github.sika-code-cloud 11 | sika-code-job 12 | 3.1.2 13 | 14 | 15 | MIT License 16 | http://www.opensource.org/licenses/mit-license.php 17 | 18 | 19 | 20 | ${revision} 21 | 3.9.1 22 | 8 23 | 8 24 | 25 | 26 | 27 | io.github.sika-code-cloud 28 | sika-code-core 29 | ${revision} 30 | 31 | 32 | org.springframework.boot 33 | spring-boot-starter-data-redis 34 | provided 35 | 36 | 37 | com.dtflys.forest 38 | forest-spring-boot-starter 39 | ${forest.version} 40 | 41 | 42 | org.redisson 43 | redisson 44 | ${redisson.version} 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /sika-code-job/README.md: -------------------------------------------------------------------------------- 1 | # ak-cloud-standard-frame 2 | 3 | 标准框架,为新项目开发保驾护航。 -------------------------------------------------------------------------------- /sika-code-job/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | sika-code 7 | io.github.sika-code-cloud 8 | ${revision} 9 | 10 | 4.0.0 11 | 12 | sika-code-job 13 | 14 | 15 | 8 16 | 8 17 | ${revision} 18 | 3.9.1 19 | 20 | 21 | 22 | io.github.sika-code-cloud 23 | sika-code-core 24 | ${revision} 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-data-redis 30 | provided 31 | 32 | 33 | com.dtflys.forest 34 | forest-spring-boot-starter 35 | ${forest.version} 36 | 37 | 38 | org.redisson 39 | redisson 40 | ${redisson.version} 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /sika-code-job/src/main/java/com/ak/cloud/standard/frame/job/base/context/BaseJobContext.java: -------------------------------------------------------------------------------- 1 | package com.ak.cloud.standard.frame.job.base.context; 2 | 3 | import com.sika.code.core.base.pojo.context.BaseContext; 4 | import com.sika.code.core.log.util.LogUtil; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDate; 9 | 10 | /** 11 | *
12 |  *  基础job上下文
13 |  * 
14 | * 15 | * @author daiqi 16 | * @version 1.0 17 | * @since 2022/5/11 15:32 18 | */ 19 | @Getter 20 | @Setter 21 | public class BaseJobContext implements BaseContext { 22 | /** 23 | * 记录日期 24 | */ 25 | private LocalDate recordDate; 26 | /** traceId */ 27 | private String traceId = LogUtil.getTraceId(); 28 | 29 | } 30 | -------------------------------------------------------------------------------- /sika-code-job/src/main/java/com/ak/cloud/standard/frame/job/base/executor/BaseJobExecutor.java: -------------------------------------------------------------------------------- 1 | package com.ak.cloud.standard.frame.job.base.executor; 2 | 3 | 4 | import com.ak.cloud.standard.frame.job.base.context.BaseJobContext; 5 | import com.sika.code.core.base.pojo.domain.entity.BaseStandardEntity; 6 | 7 | /** 8 | *
 9 |  *  基础计价执行器
10 |  * 
11 | * 12 | * @author daiqi 13 | * @version 1.0 14 | * @since 2022/5/11 15:32 15 | */ 16 | public abstract class BaseJobExecutor extends BaseStandardEntity { 17 | } 18 | -------------------------------------------------------------------------------- /sika-code-job/src/main/resources/test.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sika-code-cloud/sika-code/01878ca6812db11c0511614bba1c4fca1bcfb4f9/sika-code-job/src/main/resources/test.txt -------------------------------------------------------------------------------- /sika-code-job/src/test/java/test.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sika-code-cloud/sika-code/01878ca6812db11c0511614bba1c4fca1bcfb4f9/sika-code-job/src/test/java/test.txt -------------------------------------------------------------------------------- /sika-code-migrate/.flattened-pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | io.github.sika-code-cloud 7 | sika-code 8 | 3.1.2 9 | 10 | io.github.sika-code-cloud 11 | sika-code-migrate 12 | 3.1.2 13 | 14 | 15 | MIT License 16 | http://www.opensource.org/licenses/mit-license.php 17 | 18 | 19 | 20 | 21 | io.github.sika-code-cloud 22 | sika-code-core 23 | ${revision} 24 | 25 | 26 | com.dtflys.forest 27 | forest-spring-boot-starter 28 | ${forest.version} 29 | 30 | 31 | com.yomahub 32 | liteflow-spring-boot-starter 33 | ${liteflow.version} 34 | 35 | 36 | hutool-core 37 | cn.hutool 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /sika-code-migrate/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | sika-code 7 | io.github.sika-code-cloud 8 | ${revision} 9 | 10 | 4.0.0 11 | 12 | sika-code-migrate 13 | 14 | 15 | 16 | io.github.sika-code-cloud 17 | sika-code-core 18 | ${revision} 19 | 20 | 21 | 22 | com.dtflys.forest 23 | forest-spring-boot-starter 24 | ${forest.version} 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /sika-code-migrate/src/main/java/com/sika/code/migrate/constant/MigrateConstant.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.migrate.constant; 2 | 3 | /** 4 | *
 5 |  *  常量
 6 |  * 
7 | * 8 | * @author sikadai 9 | * @version 1.0 10 | * @since 2022/8/21 13:18 11 | */ 12 | public class MigrateConstant { 13 | public static final String FLOW_RESOURCE_KEY = "migrate-10001-flow-resource"; 14 | public static final String REQUEST_ID_KEY = "migrate-10001-request-id"; 15 | public static final String MIGRATE_TYPE_KEY = "migrate-10001-migrate-type"; 16 | public static final String MIGRATE_RULE_RESPONSE_KEY = "migrateRuleResponse"; 17 | public static final String MIGRATE_RULE_REQUEST_KEY = "migrateRuleRequest"; 18 | } 19 | -------------------------------------------------------------------------------- /sika-code-migrate/src/main/java/com/sika/code/migrate/constant/MigrateTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.migrate.constant; 2 | 3 | import com.sika.code.core.base.constant.BaseTypeEnum; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | 7 | /** 8 | *
 9 |  *  迁移类型枚举
10 |  * 
11 | * 12 | * @author sikadai 13 | * @version 1.0 14 | * @since 2022/8/20 18:33 15 | */ 16 | @Getter 17 | @AllArgsConstructor 18 | public enum MigrateTypeEnum implements BaseTypeEnum { 19 | DOUBLE_WRITE("10", "流量双写"), 20 | CONTRAST("20", "流量对比"), 21 | SWITCH("30", "流量切换"), 22 | ; 23 | private final String type; 24 | private final String desc; 25 | 26 | public static boolean isDoubleWrite(String type) { 27 | return DOUBLE_WRITE.getType().equals(type); 28 | } 29 | 30 | public static boolean isContrast(String type) { 31 | return CONTRAST.getType().equals(type); 32 | } 33 | 34 | public static boolean isSwitch(String type) { 35 | return SWITCH.getType().equals(type); 36 | } 37 | } -------------------------------------------------------------------------------- /sika-code-migrate/src/main/java/com/sika/code/migrate/executor/MigrateRequestExecutor.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.migrate.executor; 2 | 3 | import com.sika.code.migrate.pojo.MigrateRuleResult; 4 | 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | 9 | /** 10 | *
11 |  *  迁移请求执行器
12 |  * 
13 | * 14 | * @author sikadai 15 | * @version 1.0 16 | * @since 2022/8/21 12:54 17 | */ 18 | public interface MigrateRequestExecutor { 19 | /** 20 | *

21 | * 根据规则响应-执行 22 | *

23 | *
24 |      *     所需参数示例及其说明
25 |      *     参数名称 : 示例值 : 说明 : 是否必须
26 |      * 
27 | * @author sikadai 28 | * @since 2022/8/21 12:57 29 | * @param request 30 | * @param response 31 | * @return void 32 | */ 33 | boolean execute(HttpServletRequest request, HttpServletResponse response) throws IOException; 34 | 35 | } 36 | -------------------------------------------------------------------------------- /sika-code-migrate/src/main/java/com/sika/code/migrate/executor/MigrateResultExecutor.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.migrate.executor; 2 | 3 | import com.sika.code.migrate.pojo.MigrateRuleResult; 4 | 5 | /** 6 | *
 7 |  *  迁移结果执行器
 8 |  * 
9 | * 10 | * @author sikadai 11 | * @version 1.0 12 | * @since 2022/8/21 12:54 13 | */ 14 | public interface MigrateResultExecutor { 15 | /** 16 | *

17 | * 根据规则响应-执行 18 | *

19 | *
20 |      *     所需参数示例及其说明
21 |      *     参数名称 : 示例值 : 说明 : 是否必须
22 |      * 
23 | * @author sikadai 24 | * @since 2022/8/21 12:57 25 | * @param ruleResult 26 | * @return void 27 | */ 28 | void execute(MigrateRuleResult ruleResult); 29 | 30 | } 31 | -------------------------------------------------------------------------------- /sika-code-migrate/src/main/java/com/sika/code/migrate/interceptor/MigrateInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.migrate.interceptor; 2 | 3 | import com.sika.code.core.base.util.JSONUtil; 4 | import com.sika.code.migrate.executor.MigrateRequestExecutor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Component; 8 | import org.springframework.web.servlet.HandlerInterceptor; 9 | 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | 13 | /** 14 | *
15 |  *  迁移拦截器
16 |  * 
17 | * 18 | * @author daiqi 19 | * @version 1.0 20 | * @since 2022/8/8 12:50 21 | */ 22 | @Component 23 | @Slf4j 24 | public class MigrateInterceptor implements HandlerInterceptor { 25 | @Autowired 26 | private MigrateRequestExecutor requestExecutor; 27 | 28 | /** 29 | * preHandle:预先处理请求的方法 。相当于总开关 参数:Object handler:被拦截的控制器对象(Mycontroller) 30 | * 返回值:Boolean 当为真时,请求正确,可以被Controller处理,程序正常执行。 31 | * 当为假时,请求不能被处理,控制器方法不会执行。请求到此截止。 32 | * 特点:1.预处理方法的执行时间:在控制器方法之前先执行的. 2.可以对请求做处理,可以做登陆检查,全限的判断,统计数据等等 33 | */ 34 | @Override 35 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 36 | try { 37 | log.info("进入拦截器{}", MigrateInterceptor.class.getName()); 38 | log.info("进入拦截器的request为:{},请求方式为:{},response:{}", request.getClass(), request.getMethod(), response.getClass()); 39 | log.info("进入拦截器的requesthead为:{},请求方式为:{},response:{}", request.getHeaderNames(), request.getMethod(), response.getClass()); 40 | log.info("进入拦截器的getParameterMap为:{}", JSONUtil.toJSONString(request.getParameterMap())); 41 | return requestExecutor.execute(request, response); 42 | } catch (Exception e) { 43 | e.printStackTrace(); 44 | log.error(e.getMessage(), e); 45 | } 46 | return true; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /sika-code-migrate/src/main/java/com/sika/code/migrate/interceptor/MigrateResponseBodyWrite.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.migrate.interceptor; 2 | 3 | import com.sika.code.migrate.executor.MigrateResultExecutor; 4 | import com.sika.code.migrate.pojo.MigrateRuleResult; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.core.MethodParameter; 8 | import org.springframework.http.MediaType; 9 | import org.springframework.http.server.ServerHttpRequest; 10 | import org.springframework.http.server.ServerHttpResponse; 11 | import org.springframework.web.bind.annotation.ControllerAdvice; 12 | import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; 13 | 14 | @ControllerAdvice 15 | @Slf4j 16 | public class MigrateResponseBodyWrite implements ResponseBodyAdvice { 17 | @Autowired 18 | protected MigrateResultExecutor migrateResultExecutor; 19 | 20 | @Override 21 | public Object beforeBodyWrite(Object body, MethodParameter methodParameter, 22 | MediaType mediaType, Class arg3, ServerHttpRequest request, 23 | ServerHttpResponse response) { 24 | try { 25 | MigrateRuleResult ruleResult = new MigrateRuleResult(); 26 | ruleResult.setResult(body); 27 | migrateResultExecutor.execute(ruleResult); 28 | } catch (Exception e) { 29 | log.error(e.getMessage(), e); 30 | } 31 | 32 | return body; 33 | } 34 | 35 | @Override 36 | public boolean supports(MethodParameter methodParameter, Class clazz) { 37 | return true; 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /sika-code-migrate/src/main/java/com/sika/code/migrate/pojo/MigrateResultDTO.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.migrate.pojo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | *
11 |  *  迁移结果数据传输对象
12 |  * 
13 | * 14 | * @author sikadai 15 | * @version 1.0 16 | * @since 2022/8/21 11:40 17 | */ 18 | @Data 19 | @AllArgsConstructor 20 | @NoArgsConstructor 21 | public class MigrateResultDTO { 22 | private Object result; 23 | private Map header; 24 | private String requestId; 25 | } 26 | -------------------------------------------------------------------------------- /sika-code-migrate/src/main/java/com/sika/code/migrate/pojo/MigrateRuleRequest.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.migrate.pojo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnore; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.util.List; 10 | import java.util.Map; 11 | 12 | /** 13 | *
14 |  *  迁移数据传输对象
15 |  * 
16 | * 17 | * @author sikadai 18 | * @version 1.0 19 | * @since 2022/8/20 8:42 20 | */ 21 | @Data 22 | @Accessors(chain = true) 23 | public class MigrateRuleRequest { 24 | /** 25 | * 当前请求的request 26 | */ 27 | @JsonIgnore 28 | private HttpServletRequest request; 29 | /** 30 | * 当前请求的response 31 | */ 32 | @JsonIgnore 33 | private HttpServletResponse response; 34 | /** 35 | * 请求完整路径 36 | */ 37 | private String requestFullPath; 38 | /** 39 | * 请求的Uri - 不包含域名和端口号 40 | */ 41 | private String requestUri; 42 | /** 43 | * 请求的参数-请求体参数 44 | */ 45 | private Map requestBody; 46 | /** 47 | * 请求的参数-请求查询参数-值有可能是数组 48 | */ 49 | private Map> requestQueryParam; 50 | /** 51 | * 请求头的参数key+value 52 | */ 53 | private Map> requestHeadParam; 54 | /** 55 | * 其他额外的参数 56 | */ 57 | private Map extraParam; 58 | } 59 | -------------------------------------------------------------------------------- /sika-code-migrate/src/main/java/com/sika/code/migrate/pojo/MigrateRuleResponse.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.migrate.pojo; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.google.common.collect.Maps; 5 | import lombok.Data; 6 | import lombok.experimental.Accessors; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | *
12 |  *  迁移规则响应结果
13 |  * 
14 | * 15 | * @author sikadai 16 | * @version 1.0 17 | * @since 2022/8/20 8:43 18 | */ 19 | @Data 20 | @Accessors(chain = true) 21 | public class MigrateRuleResponse { 22 | /** 23 | * 规则匹配结果 - true代表匹配-其他不匹配 24 | */ 25 | private Boolean match; 26 | /** 27 | * 需要重定向的url 28 | */ 29 | private String redirectUrl; 30 | /** 31 | * 其他额外参数 - 如果该参数不为空-将会将其添加到重定向的请求头中进行重定向 32 | */ 33 | private Map extraParam; 34 | /** 35 | * 迁移类型 36 | */ 37 | private String migrateType; 38 | /** 当前请求的ID */ 39 | private String requestId; 40 | 41 | public void putExtraParam(String key, String value) { 42 | if (StrUtil.isBlank(key)) { 43 | return; 44 | } 45 | if (value == null) { 46 | return; 47 | } 48 | if (extraParam == null) { 49 | extraParam = Maps.newLinkedHashMap(); 50 | } 51 | extraParam.put(key, value); 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /sika-code-migrate/src/main/java/com/sika/code/migrate/pojo/MigrateRuleResult.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.migrate.pojo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | *
 7 |  *  迁移规则
 8 |  * 
9 | * 10 | * @author sikadai 11 | * @version 1.0 12 | * @since 2022/8/21 13:02 13 | */ 14 | @Data 15 | public class MigrateRuleResult { 16 | /** 结果 */ 17 | private Object result; 18 | } 19 | -------------------------------------------------------------------------------- /sika-code-migrate/src/main/java/com/sika/code/migrate/rule/MigrateRequestRule.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.migrate.rule; 2 | 3 | 4 | import com.sika.code.migrate.pojo.MigrateRuleRequest; 5 | import com.sika.code.migrate.pojo.MigrateRuleResponse; 6 | 7 | /** 8 | *
 9 |  *  迁移规则
10 |  * 
11 | * 12 | * @author sikadai 13 | * @version 1.0 14 | * @since 2022/8/20 8:41 15 | */ 16 | public interface MigrateRequestRule { 17 | /** 18 | *

19 | * 规则匹配 20 | *

21 | *
22 |      *     所需参数示例及其说明
23 |      *     参数名称 : 示例值 : 说明 : 是否必须
24 |      *     request : HttpServletRequest : 请求对象 : 必须
25 |      *     response : HttpServletResponse : 响应对象 : 必须
26 |      *     以下参数都是从当前request提取出来的
27 |      *     requestFullPath : http://xxx.eee/test/find : 请求完整路径 : 必须
28 |      *     requestUri : test/find : 请求的uri : 必须
29 |      *     requestBody : {} : 请求体参数 : 若没有则为集合
30 |      *     requestQueryParam : {} : 请求查询参数 : 若没有则为空集合
31 |      *     requestHeadParam : {} : 请求头参数 : 若没有则为空集合
32 |      * 
33 | * 34 | * @param ruleRequest 35 | * @return com.sika.code.demo.interfaces.common.migrate.pojo.MigrateRuleResponse 36 | * @author sikadai 37 | * @since 2022/8/20 9:01 38 | */ 39 | MigrateRuleResponse match(MigrateRuleRequest ruleRequest); 40 | } 41 | -------------------------------------------------------------------------------- /sika-code-migrate/src/main/java/com/sika/code/migrate/util/SpringMVCUtil.java: -------------------------------------------------------------------------------- 1 | package com.sika.code.migrate.util; 2 | 3 | import org.springframework.web.context.request.RequestContextHolder; 4 | import org.springframework.web.context.request.ServletRequestAttributes; 5 | 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | 9 | /** 10 | *
11 |  *  springMvc的工具类
12 |  * 
13 | * 14 | * @author sikadai 15 | * @version 1.0 16 | * @since 2022/8/21 10:21 17 | */ 18 | public class SpringMVCUtil { 19 | 20 | public static HttpServletRequest getRequest() { 21 | ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); 22 | if (servletRequestAttributes == null) { 23 | throw new RuntimeException("非Web上下文无法获取Request"); 24 | } else { 25 | return servletRequestAttributes.getRequest(); 26 | } 27 | } 28 | 29 | public static HttpServletResponse getResponse() { 30 | ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); 31 | if (servletRequestAttributes == null) { 32 | throw new RuntimeException("非Web上下文无法获取Response"); 33 | } else { 34 | return servletRequestAttributes.getResponse(); 35 | } 36 | } 37 | 38 | public static boolean isWeb() { 39 | return RequestContextHolder.getRequestAttributes() != null; 40 | } 41 | } 42 | --------------------------------------------------------------------------------