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";
+}