diff --git a/ruoyi-auth/src/main/resources/bootstrap.yml b/ruoyi-auth/src/main/resources/bootstrap.yml index f456b03c..6cd0792f 100644 --- a/ruoyi-auth/src/main/resources/bootstrap.yml +++ b/ruoyi-auth/src/main/resources/bootstrap.yml @@ -1,6 +1,6 @@ # Tomcat server: - port: 9200 + port: 9100 # Spring spring: diff --git a/ruoyi-modules/ruoyi-product/pom.xml b/ruoyi-modules/ruoyi-product/pom.xml index 3022cc8e..b2bf757b 100644 --- a/ruoyi-modules/ruoyi-product/pom.xml +++ b/ruoyi-modules/ruoyi-product/pom.xml @@ -40,12 +40,21 @@ spring-cloud-starter-alibaba-sentinel + + org.springframework.boot + spring-boot-starter-data-elasticsearch + + org.springframework.boot spring-boot-starter-actuator - + + + org.springframework.boot + spring-boot-starter-data-redis + io.springfox diff --git a/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/RuoYiProductApplication.java b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/RuoYiProductApplication.java index 51cc078c..2fe71da1 100644 --- a/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/RuoYiProductApplication.java +++ b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/RuoYiProductApplication.java @@ -5,6 +5,7 @@ import com.ruoyi.common.security.annotation.EnableRyFeignClients; import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; /** * 系统模块 @@ -15,6 +16,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableCustomSwagger2 @EnableRyFeignClients @SpringBootApplication +@EnableScheduling //定时任务 public class RuoYiProductApplication { public static void main(String[] args) diff --git a/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/config/ElasticsearchConfig.java b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/config/ElasticsearchConfig.java new file mode 100644 index 00000000..1e1b927a --- /dev/null +++ b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/config/ElasticsearchConfig.java @@ -0,0 +1,25 @@ +package com.ruoyi.product.config; + +import org.elasticsearch.client.RestHighLevelClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.elasticsearch.client.ClientConfiguration; +import org.springframework.data.elasticsearch.client.RestClients; + +@Configuration +public class ElasticsearchConfig { + @Bean + RestHighLevelClient elasticsearchClient() { + ClientConfiguration configuration = ClientConfiguration.builder() + .connectedTo("localhost:9200") + //.withConnectTimeout(Duration.ofSeconds(5)) + //.withSocketTimeout(Duration.ofSeconds(3)) + //.useSsl() + //.withDefaultHeaders(defaultHeaders) + //.withBasicAuth(username, password) + // ... other options + .build(); + RestHighLevelClient client = RestClients.create(configuration).rest(); + return client; + } +} diff --git a/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/config/MybatisPlusConfig.java b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/config/MybatisPlusConfig.java new file mode 100644 index 00000000..21638617 --- /dev/null +++ b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/config/MybatisPlusConfig.java @@ -0,0 +1,24 @@ +package com.ruoyi.product.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MybatisPlusConfig { + + /** + * 新的分页插件,一缓和二缓遵循mybatis的规则, + * 需要设置 MybatisConfiguration#useDeprecatedExecutor = false + * 避免缓存出现问题(该属性会在旧插件移除后一同移除) + */ + // 最新版 + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } +} diff --git a/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/controller/ProductController.java b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/controller/ProductController.java index c1cdac77..ea6d24df 100644 --- a/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/controller/ProductController.java +++ b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/controller/ProductController.java @@ -69,5 +69,15 @@ public class ProductController { } + /** + * 通过id查询数据 + * @param productInfoVo + * @return + */ + @PostMapping(value = "/selectProduct") + public AjaxResult selectProduct(@RequestBody ProductInfoVo productInfoVo){ + return tbFinancialProductService.selectProduct(productInfoVo); + } + } diff --git a/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/pojo/TbFinancialProduct.java b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/pojo/TbFinancialProduct.java index 519dca00..dd3c0f0b 100644 --- a/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/pojo/TbFinancialProduct.java +++ b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/pojo/TbFinancialProduct.java @@ -6,7 +6,14 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; +import org.springframework.data.elasticsearch.annotations.DateFormat; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; +import org.springframework.format.annotation.DateTimeFormat; /** * 金融产品表 @@ -14,6 +21,7 @@ import lombok.Data; */ @TableName(value ="tb_financial_product") @Data +@Document(indexName = "tb_financial_product") public class TbFinancialProduct implements Serializable { /** * @@ -34,6 +42,7 @@ public class TbFinancialProduct implements Serializable { /** * 产品名称 */ + @Field(type = FieldType.Text,analyzer = "ik_max_word") private String productName; /** @@ -109,6 +118,9 @@ public class TbFinancialProduct implements Serializable { /** * 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @Field(type = FieldType.Date,format = DateFormat. custom,pattern = "yyy-MM-dd HH:mm: ss") private Date createTime; /** @@ -119,6 +131,9 @@ public class TbFinancialProduct implements Serializable { /** * 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @Field(type = FieldType.Date,format = DateFormat. custom,pattern = "yyy-MM-dd HH:mm: ss") private Date updateTime; @TableField(exist = false) diff --git a/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/service/TbFinancialProductService.java b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/service/TbFinancialProductService.java index c40ad962..b9fb0f7a 100644 --- a/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/service/TbFinancialProductService.java +++ b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/service/TbFinancialProductService.java @@ -21,4 +21,6 @@ public interface TbFinancialProductService extends IService AjaxResult deleteById(IdVo idVo); AjaxResult updateId(ProductInfoVo productInfoVo); + + AjaxResult selectProduct(ProductInfoVo productInfoVo); } diff --git a/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/service/impl/TbFinancialProductServiceImpl.java b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/service/impl/TbFinancialProductServiceImpl.java index 95b7aa34..b34ef6f1 100644 --- a/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/service/impl/TbFinancialProductServiceImpl.java +++ b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/service/impl/TbFinancialProductServiceImpl.java @@ -11,9 +11,22 @@ import com.ruoyi.product.pojo.vo.ProductInfoVo; import com.ruoyi.product.service.TbFinancialProductService; import com.ruoyi.product.mapper.TbFinancialProductMapper; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.query.TermQueryBuilder; +import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.SortBuilder; +import org.elasticsearch.search.sort.SortOrder; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; +import org.springframework.data.elasticsearch.core.SearchHits; +import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.stream.Collectors; @@ -26,6 +39,8 @@ public class TbFinancialProductServiceImpl extends ServiceImpl page = new Page<>(pageInfoVo.getPageNum(), pageInfoVo.getPageSize()); - Page financialProductPage = page(page, new QueryWrapper().lambda().eq(TbFinancialProduct::getFirmName, pageInfoVo.getKeyword()).last("limit 1")); - List collect = financialProductPage.getRecords().stream().map((item) -> { + if(pageInfoVo.getKeyword()==null){ + Page page = new Page<>(pageInfoVo.getPageNum(), pageInfoVo.getPageSize()); + //.lambda().eq(TbFinancialProduct::getFirmName, pageInfoVo.getKeyword()).last("limit 1") + Page financialProductPage = page(page, new QueryWrapper<>()); + List collect = financialProductPage.getRecords().stream().map((item) -> { + ProductInfoVo productInfoVo = new ProductInfoVo(); + BeanUtils.copyProperties(item, productInfoVo); + return productInfoVo; + + }).collect(Collectors.toList()); + Page infoVoPage = new Page<>(); + infoVoPage.setRecords(collect); + infoVoPage.setCurrent(financialProductPage.getCurrent()); + infoVoPage.setSize(financialProductPage.getSize()); + infoVoPage.setTotal(financialProductPage.getTotal()); + + return AjaxResult.success(infoVoPage); + } + //获取分页数据 + Pageable page = PageRequest.of(pageInfoVo.getPageNum() - 1, pageInfoVo.getPageSize()); + TermQueryBuilder termQuery = QueryBuilders.termQuery("productName", pageInfoVo.getKeyword()); + SortBuilder sortBuilder = new FieldSortBuilder("createTime").order(SortOrder.DESC); + //高亮查询数据 + HighlightBuilder highlightBuilder = new HighlightBuilder(); + highlightBuilder.preTags("") + .postTags("") + .field("productName"); + NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(termQuery) + .withPageable(page) + .withSort(sortBuilder) + .withHighlightBuilder(highlightBuilder) +// .withQuery(queryBuilder) + .build(); + long total = elasticsearchRestTemplate.count(searchQuery, TbFinancialProduct.class); + SearchHits search = elasticsearchRestTemplate.search(searchQuery, TbFinancialProduct.class); + List productInfoVoList = search.getSearchHits().stream().map((item) -> { + TbFinancialProduct content = item.getContent(); + List productName = item.getHighlightField("productName"); + if (productName != null && productName.size() > 0) { + String name = productName.get(0); + //设置高亮查询 + content.setProductName(name); + + } ProductInfoVo productInfoVo = new ProductInfoVo(); - BeanUtils.copyProperties(item, productInfoVo); + BeanUtils.copyProperties(content, productInfoVo); return productInfoVo; - }).collect(Collectors.toList()); Page infoVoPage = new Page<>(); - infoVoPage.setRecords(collect); - infoVoPage.setCurrent(financialProductPage.getCurrent()); - infoVoPage.setSize(financialProductPage.getSize()); - infoVoPage.setTotal(financialProductPage.getTotal()); + infoVoPage.setRecords(productInfoVoList); + infoVoPage.setCurrent(pageInfoVo.getPageNum()-1); + infoVoPage.setSize(pageInfoVo.getPageSize()); + infoVoPage.setTotal(total); return AjaxResult.success(infoVoPage); + + } /** @@ -57,6 +115,7 @@ public class TbFinancialProductServiceImpl extends ServiceImpl().lambda().eq(TbFinancialProduct::getFirmName, firmName)); @@ -66,8 +125,7 @@ public class TbFinancialProductServiceImpl extends ServiceImpl().lambda().eq(TbFinancialProduct::getProductId, productId)); + if(one==null){ + return AjaxResult.error(402,"产品Id不存在"); + } + TbFinancialProduct financialProduct = tbFinancialProductMapper.selectById(productId); + return AjaxResult.success(financialProduct); + } } diff --git a/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/task/TaskQuartz.java b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/task/TaskQuartz.java new file mode 100644 index 00000000..3f7a18cd --- /dev/null +++ b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/task/TaskQuartz.java @@ -0,0 +1,85 @@ +package com.ruoyi.product.task; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ruoyi.product.mapper.TbFinancialProductMapper; +import com.ruoyi.product.pojo.TbFinancialProduct; +import com.ruoyi.product.var.ConstantVars; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; +import org.springframework.data.elasticsearch.core.document.Document; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @version 1.0 + * @description: TODO + * @author杨宗理 + * @date 2023/1/18 15:16 + */ +@Component +@Slf4j +public class TaskQuartz { + @Autowired + ElasticsearchRestTemplate elasticsearchTemplate; + @Autowired + private RedisTemplate redisTemplate; + @Autowired + private TbFinancialProductMapper tbFinancialProductMapper; + @Scheduled(fixedDelay = 1000*60) + public void ProductQuartz(){ + //判断索引 + if(!elasticsearchTemplate.indexOps(TbFinancialProduct.class).exists()){ + elasticsearchTemplate.indexOps(TbFinancialProduct.class).create(); + Document mapping = elasticsearchTemplate.indexOps(TbFinancialProduct.class).createMapping(); + elasticsearchTemplate.indexOps(TbFinancialProduct.class).putMapping(mapping); + + } + String strTime = (String) redisTemplate.opsForValue().get(ConstantVars.SYNC_PRODUCT_KEY); + + if(strTime==null){ + //全量同步 + List list = tbFinancialProductMapper.selectList(new QueryWrapper().lambda().orderByDesc(TbFinancialProduct::getCreateTime)); + if(list!=null && list.size()>0){ + elasticsearchTemplate.save(list); + TbFinancialProduct product = list.get(0); + Date updateTime = product.getUpdateTime(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String format = sdf.format(updateTime); + //存入redis中 + redisTemplate.opsForValue().set(ConstantVars.SYNC_PRODUCT_KEY,format); + + } + return; + + } + + //增量同步 + //全量同步 + List list = tbFinancialProductMapper.selectList(new QueryWrapper().lambda().gt(TbFinancialProduct::getUpdateTime,strTime) + .orderByDesc(TbFinancialProduct::getCreateTime)); + if(list!=null && list.size()>0){ + elasticsearchTemplate.save(list); + TbFinancialProduct product = list.get(0); + Date updateTime = product.getUpdateTime(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String format = sdf.format(updateTime); + //存入redis中 + redisTemplate.opsForValue().set(ConstantVars.SYNC_PRODUCT_KEY,format); + + } + return; + + + } + + + + + +} diff --git a/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/var/ConstantVars.java b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/var/ConstantVars.java new file mode 100644 index 00000000..b076ca19 --- /dev/null +++ b/ruoyi-modules/ruoyi-product/src/main/java/com/ruoyi/product/var/ConstantVars.java @@ -0,0 +1,12 @@ +package com.ruoyi.product.var; + +/** + * @version 1.0 + * @description: TODO + * @author杨宗理 + * @date 2023/1/19 21:45 + */ +public interface ConstantVars { + //作为Key值 + final String SYNC_PRODUCT_KEY="SYNC_PRODUCT_KEY"; +}