Ver código fonte

增加论文、研究等表的高级检索

叶凌辰 11 meses atrás
pai
commit
7861bb7bdc

+ 4 - 5
src/main/java/com/ruoyi/project/VRdemo/controller/SearchController.java

@@ -1,9 +1,9 @@
 package com.ruoyi.project.VRdemo.controller;
 
 import com.ruoyi.framework.aspectj.lang.annotation.Anonymous;
-import com.ruoyi.project.VRdemo.domain.Press;
 import com.ruoyi.project.VRdemo.domain.SearchData;
 import com.ruoyi.project.VRdemo.service.ISearchService;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -14,13 +14,12 @@ import java.util.List;
 public class SearchController {
 
     @Autowired
-    private ISearchService ISearchService;
+    private ISearchService searchService;
 
     // 高级检索功能接口
     @Anonymous
     @PostMapping("/SearchDatabases")
-    public List<Press> SearchDatabases(@RequestBody List<SearchData> searchData) {
-        String query = ISearchService.analyticParameter(searchData);
-        return ISearchService.ExecuteSearchSql(query);
+    public List<Object> searchDatabases(@RequestBody List<SearchData> searchData) {
+        return searchService.MappingSelection(searchData);
     }
 }

+ 10 - 0
src/main/java/com/ruoyi/project/VRdemo/domain/Press.java

@@ -39,6 +39,8 @@ public class Press extends BaseEntity
     @ExcelProperty("刊名")
     private String pressTitle;
 
+    private String press_title;
+
     /** 年份 */
     @JsonFormat(pattern = "yyyy")
     @ExcelProperty("年份")
@@ -96,6 +98,14 @@ public class Press extends BaseEntity
         this.pressTitle = pressTitle;
     }
 
+    public String getPress_title() {
+        return press_title;
+    }
+
+    public void setPress_title(String press_title) {
+        this.press_title = press_title;
+    }
+
     public Date getDate() {
         return date;
     }

+ 23 - 23
src/main/java/com/ruoyi/project/VRdemo/domain/Research.java

@@ -9,7 +9,7 @@ import com.ruoyi.framework.web.domain.BaseEntity;
 
 /**
  * 研究对象 vr_research
- * 
+ *
  * @author ruoyi
  * @date 2024-06-23
  */
@@ -45,66 +45,66 @@ public class Research extends BaseEntity
     @Excel(name = "分类号")
     private String category;
 
-    public void setId(Long id) 
+    public void setId(Long id)
     {
         this.id = id;
     }
 
-    public Long getId() 
+    public Long getId()
     {
         return id;
     }
-    public void setTitle(String title) 
+    public void setTitle(String title)
     {
         this.title = title;
     }
 
-    public String getTitle() 
+    public String getTitle()
     {
         return title;
     }
-    public void setAuthor(String author) 
+    public void setAuthor(String author)
     {
         this.author = author;
     }
 
-    public String getAuthor() 
+    public String getAuthor()
     {
         return author;
     }
-    public void setInstitution(String institution) 
+    public void setInstitution(String institution)
     {
         this.institution = institution;
     }
 
-    public String getInstitution() 
+    public String getInstitution()
     {
         return institution;
     }
-    public void setTopic(String topic) 
+    public void setTopic(String topic)
     {
         this.topic = topic;
     }
 
-    public String getTopic() 
+    public String getTopic()
     {
         return topic;
     }
-    public void setPublicationTime(Date publicationTime) 
+    public void setPublicationTime(Date publicationTime)
     {
         this.publicationTime = publicationTime;
     }
 
-    public Date getPublicationTime() 
+    public Date getPublicationTime()
     {
         return publicationTime;
     }
-    public void setCategory(String category) 
+    public void setCategory(String category)
     {
         this.category = category;
     }
 
-    public String getCategory() 
+    public String getCategory()
     {
         return category;
     }
@@ -112,13 +112,13 @@ public class Research extends BaseEntity
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("id", getId())
-            .append("title", getTitle())
-            .append("author", getAuthor())
-            .append("institution", getInstitution())
-            .append("topic", getTopic())
-            .append("publicationTime", getPublicationTime())
-            .append("category", getCategory())
-            .toString();
+                .append("id", getId())
+                .append("title", getTitle())
+                .append("author", getAuthor())
+                .append("institution", getInstitution())
+                .append("topic", getTopic())
+                .append("publicationTime", getPublicationTime())
+                .append("category", getCategory())
+                .toString();
     }
 }

+ 18 - 6
src/main/java/com/ruoyi/project/VRdemo/domain/SearchData.java

@@ -2,11 +2,22 @@ package com.ruoyi.project.VRdemo.domain;
 
 
 public class SearchData {
-    private int index;
-    private String field_name;
-    private String query_concat;
-    private String query_style;
-    private String text;
+    private String dataType; // 表名
+    private int index; // 索引
+    private String field_name; // 字段名
+    private String query_concat; // 逻辑操作符
+    private String query_style; // 查询方式
+    private String text; // 搜索内容
+
+
+
+    public String getDataType() {
+        return dataType;
+    }
+
+    public void setDataType(String dataType) {
+        this.dataType = dataType;
+    }
 
     public int getIndex() {
         return index;
@@ -51,7 +62,8 @@ public class SearchData {
     @Override
     public String toString() {
         return "SearchData{" +
-                "index=" + index +
+                "dataType='" + dataType + '\'' +
+                "index=" + index + '\'' +
                 ", field_name='" + field_name + '\'' +
                 ", query_concat='" + query_concat + '\'' +
                 ", query_style='" + query_style + '\'' +

+ 17 - 2
src/main/java/com/ruoyi/project/VRdemo/mapper/SearchDataMapper.java

@@ -1,8 +1,11 @@
 package com.ruoyi.project.VRdemo.mapper;
 
 import com.ruoyi.project.VRdemo.domain.Press;
+import com.ruoyi.project.VRdemo.domain.Research;
+import com.ruoyi.project.VRdemo.domain.Thesis;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Select;
+import org.apache.poi.ss.formula.functions.T;
 
 import java.util.List;
 
@@ -10,9 +13,21 @@ import java.util.List;
 public interface SearchDataMapper {
 
     /**
-     * 查询press列表
+     * 查询vr_press列表
      */
     @Select("${SqlString}")
-    public List<Press> ExecuteSearchSql(String SqlString);
+    List<Press> ExecuteSearchPressSql(String SqlString);
 
+
+    /**
+     * 查询vr_research列表
+     */
+    @Select("${SqlString}")
+    List<Research> ExecuteSearchResearchSql(String SqlString);
+
+    /**
+     * 查询vr_thesis列表
+     */
+    @Select("${SqlString}")
+    List<Thesis> ExecuteSearchThesisSql(String SqlString);
 }

+ 3 - 6
src/main/java/com/ruoyi/project/VRdemo/service/ISearchService.java

@@ -1,14 +1,11 @@
 package com.ruoyi.project.VRdemo.service;
 
-import com.ruoyi.project.VRdemo.domain.Press;
 import com.ruoyi.project.VRdemo.domain.SearchData;
+
+
 import java.util.List;
 
 public interface ISearchService {
 
-    // 解析JSON数据 获取查询语句
-    String analyticParameter(List<SearchData> searchData);
-
-    // 获取检索数据
-    List<Press> ExecuteSearchSql(String SqlString);
+    List<Object> MappingSelection(List<SearchData> searchData);
 }

+ 107 - 54
src/main/java/com/ruoyi/project/VRdemo/service/impl/SearchServiceImpl.java

@@ -1,7 +1,9 @@
 package com.ruoyi.project.VRdemo.service.impl;
 
 import com.ruoyi.project.VRdemo.domain.Press;
+import com.ruoyi.project.VRdemo.domain.Research;
 import com.ruoyi.project.VRdemo.domain.SearchData;
+import com.ruoyi.project.VRdemo.domain.Thesis;
 import com.ruoyi.project.VRdemo.mapper.SearchDataMapper;
 import com.ruoyi.project.VRdemo.service.ISearchService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,36 +20,88 @@ public class SearchServiceImpl implements ISearchService {
     private SearchDataMapper searchDataMapper;
 
     @Override
-    public String analyticParameter(List<SearchData> searchData) {
-        // 按照index排序
-        searchData.sort(Comparator.comparingInt(SearchData::getIndex));
-        StringBuilder sql = new StringBuilder("SELECT * FROM vr_press WHERE ");
+    public List<Object> MappingSelection(List<SearchData> searchData) {
+        String dataQueryType = searchData.get(0).getDataType();
+        // 匹配数据类型
+        switch (dataQueryType) {
+            case "periodicals":
+                return new ArrayList<>(handlePeriodicals(searchData));
+            case "study":
+                return new ArrayList<>(handleStudy(searchData));
+            case "thesis":
+                return new ArrayList<>(handleThesis(searchData));
+            default:
+                return null;
+        }
+    }
+
+
+    // 期刊逻辑
+    private List<Press> handlePeriodicals(List<SearchData> searchData) {
+        StringBuilder SQL = new StringBuilder("SELECT * FROM vr_press WHERE ");
+        analyticParameter(searchData, SQL);
+        return searchDataMapper.ExecuteSearchPressSql(SQL.toString());
+    }
+
+    // 研究逻辑
+    private List<Research> handleStudy(List<SearchData> searchData) {
+        StringBuilder SQL = new StringBuilder("SELECT * FROM vr_research WHERE ");
+        analyticParameter(searchData, SQL);
+        return searchDataMapper.ExecuteSearchResearchSql(SQL.toString());
+    }
+
+    // 论文逻辑
+    private List<Thesis> handleThesis(List<SearchData> searchData) {
+        StringBuilder SQL = new StringBuilder("SELECT * FROM vr_thesis WHERE ");
+        analyticParameter(searchData, SQL);
+        return searchDataMapper.ExecuteSearchThesisSql(SQL.toString());
+    }
+
 
+    public static void analyticParameter(List<SearchData> searchData, StringBuilder sql) {
+        searchData.sort(Comparator.comparingInt(SearchData::getIndex));
         int searchDataSize = searchData.size();
+        int timeJudgment = 0;
         for (int i = 0; i < searchDataSize; i++) {
             SearchData query = searchData.get(i);
-            // 添加条件连接符
-            if(i != 0){
-                sql.append(" ").append(query.getQuery_concat()).append(" ");
+            if (query.getIndex() == 90) {
+                if (i == 0) {
+                    sql.append(" ").append(query.getField_name()).append(" >= ").append("'").append(query.getText()).append("'");
+                } else {
+                    sql.append(" AND ").append(query.getField_name()).append(" >= ").append("'").append(query.getText()).append("'");
+                }
+                timeJudgment++;
+                continue;
+            } else if (query.getIndex() == 100) {
+                timeJudgment++;
+                if (timeJudgment == 2) {
+                    sql.append(" AND ").append(query.getField_name()).append(" <= ").append("'").append(query.getText()).append("'");
+                } else {
+                    sql.append(" ").append(query.getField_name()).append(" <= ").append("'").append(query.getText()).append("'");
+                }
+                continue;
+            }
+            if (i != 0) {
+                if (query.getQuery_concat().equals("NOT")) {
+                    if (query.getQuery_style().equals("fuzzy")) {
+                        sql.append(" AND ").append(query.getField_name()).append(" NOT ").append("LIKE '%").append(query.getText()).append("%'");
+                    } else {
+                        sql.append(" AND ").append(query.getField_name()).append(" <> ").append("'").append(query.getText()).append("'");
+                    }
+                    continue;
+                } else {
+                    sql.append(" ").append(query.getQuery_concat()).append(" ");
+                }
             }
-            // 单项查询
-            if(searchDataSize == 1){
-                sql.append(parseLogicOperators(query.getField_name(),query.getText()));
-                return sql.toString();
+            if (searchDataSize == 1) {
+                sql.append(parseLogicOperators(query.getField_name(), query.getText(), query.getQuery_style()));
+                return;
             }
-            // 添加查询条件
             sql.append(handleQueryCondition(query));
         }
-
-        return sql.toString();
     }
 
-    /**
-     * 处理单个查询条件并返回对应的SQL片段。
-     * @param query 查询数据对象
-     * @return SQL片段
-     */
-    private String handleQueryCondition(SearchData query) {
+    private static String handleQueryCondition(SearchData query) {
         String text = query.getText();
         switch (query.getQuery_style()) {
             case "precise":
@@ -59,39 +113,39 @@ public class SearchServiceImpl implements ISearchService {
         }
     }
 
-    /**
-     * 解析单项查询逻辑运算符并返回转换后的字符串。
-     * @param text 输入字符串
-     * @return 转换后的字符串
-     */
-    public StringBuilder parseLogicOperators(String fieldName, String text) {
-
-        List<String> protectedContents = new ArrayList<>(); // 用于存储双引号内的内容
-        String placeholder = "TEMP_PLUS_PLACEHOLDER"; // 占位符
-
-        // 使用Pattern和Matcher来查找并处理双引号内的内容
+    public static StringBuilder parseLogicOperators(String fieldName, String text, String queryStyle) {
+        Map<String, String> replaceMap = new HashMap<>();
+        replaceMap.put("*", "AND");
+        replaceMap.put("+", "OR");
+        replaceMap.put("-", "NOT");
+        replaceMap.put("(", "(");
+        replaceMap.put(")", ")");
+        boolean needsReplacement = false;
+        for (Map.Entry<String, String> entry : replaceMap.entrySet()) {
+            if (text.contains(entry.getKey())) {
+                needsReplacement = true;
+                break;
+            }
+        }
         Pattern pattern = Pattern.compile("\"([^\"]*)\"");
         Matcher matcher = pattern.matcher(text);
         StringBuffer sb = new StringBuffer();
+        String placeholder = "TEMP_PLUS_PLACEHOLDER";
+        List<String> protectedContents = new ArrayList<>();
         while (matcher.find()) {
-            String contentInsideQuotes = matcher.group(1); // 获取双引号内的内容
-            protectedContents.add(contentInsideQuotes); // 保存内容
-            matcher.appendReplacement(sb, placeholder); // 替换为占位符
+            protectedContents.add(matcher.group(1));
+            matcher.appendReplacement(sb, placeholder);
         }
         matcher.appendTail(sb);
         text = sb.toString();
-
-        // 替换逻辑运算符
-        text = text.replace("*", "AND")
-                   .replace("+", "OR")
-                   .replace("-", "NOT");
-
-        // 恢复双引号内的内容
+        if (needsReplacement) {
+            for (Map.Entry<String, String> entry : replaceMap.entrySet()) {
+                text = text.replace(entry.getKey(), entry.getValue());
+            }
+        }
         for (String protectedContent : protectedContents) {
             text = text.replaceFirst("TEMP_PLUS_PLACEHOLDER", protectedContent);
         }
-
-        // 使用正则表达式拆分条件,并保留括号和逻辑运算符
         List<String> conditions = new ArrayList<>();
         Matcher conditionMatcher = Pattern.compile("\\(|\\)|\\bAND\\b|\\bOR\\b|\\bNOT\\b|[^\\s()]+").matcher(text);
         while (conditionMatcher.find()) {
@@ -100,25 +154,24 @@ public class SearchServiceImpl implements ISearchService {
                 conditions.add(match.trim());
             }
         }
-
-        // 构建SQL条件
         StringBuilder condition = new StringBuilder();
+        boolean notFlag = false;
         for (String item : conditions) {
-            boolean isLogicalOperatorOrBracket = "AND".equals(item) || "OR".equals(item) || "NOT".equals(item) || "(".equals(item) || ")".equals(item);
+            if ("NOT".equals(item)) {
+                condition.append(" AND ").append(fieldName).append(" NOT ");
+                notFlag = true;
+                continue;
+            }
+            boolean isLogicalOperatorOrBracket = "AND".equals(item) || "OR".equals(item) || "(".equals(item) || ")".equals(item);
             if (isLogicalOperatorOrBracket) {
                 condition.append(" ").append(item).append(" ");
+            } else if (notFlag) {
+                condition.append("LIKE '%").append(item).append("%'");
+                notFlag = false;
             } else {
                 condition.append(fieldName).append(" LIKE '%").append(item).append("%'");
             }
         }
-
         return condition;
     }
-
-
-    // 执行查询
-    public List<Press> ExecuteSearchSql(String SqlString) {
-        return searchDataMapper.ExecuteSearchSql(SqlString);
-    }
-
 }