package com.zhjt.exchange.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zhjt.exchange.mapper.GlobalSearchMapper;
import com.zhjt.exchange.service.GlobalSearchService;
import com.zhjt.zh_api.model.search.dto.GlobalSearchRequest;
import com.zhjt.zh_api.model.search.dto.GlobalSearchRes;
import com.zhjt.zh_api.model.search.po.SearchResult;
import io.swagger.models.auth.In;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Service
public class GlobalSearchServiceImpl implements GlobalSearchService {
@Resource
GlobalSearchMapper searchMapper;
/**
*
* firstType第一分类:1 业务数据,2 附件,3 功能
*
* secondType第二分类,与第一分类对应:
* 1)业务数据:1 隐患,2 风险,3 事故
* 2)附件:1 图片,2 视频,3 文件
* 3)功能无第二分类
*
* thirdType第三分类,与第二分类对应:
* 1)业务数据无第三分类
* 2)附件
* a.图片:1 png,2 bmp,3 jpg,4 jpeg
* b.视频:1 mp4
* c.文件:1 doc/docx,2 pdf,3 ppt,4 xls/xlsx,5 txt
* 3)功能无第三分类
*/
@Override
public GlobalSearchRes globalSearch(GlobalSearchRequest request) {
List<String> keyWordList = new ArrayList<>();
keyWordList.add(request.getKeyWord());
// 若输入的关键字不为空,按最多2字符切割组成集合
/*String keyWord = request.getKeyWord();
if (StringUtils.isNotBlank(keyWord)) {
for (int i = 0; i < keyWord.length(); i = i + 2) {
if (i + 2 <= keyWord.length()) {
keyWordList.add(keyWord.substring(i, i + 2));
} else {
keyWordList.add(keyWord.substring(i, i + 1));
}
}
}*/
GlobalSearchRes searchResponse = new GlobalSearchRes();
List<SearchResult> list = new ArrayList<>();
PageHelper.startPage(request.getPage(), request.getLimit());
// 查业隐患风险务数据
if (request.getFirstType() == 1) {
list = searchMapper.getBusinessData(keyWordList, request.getSecondType(), request.getYear(), request.getMonth());
}
// 查文件
if (request.getFirstType() == 2) {
/**
* 按照文件名排序
* */
if (!Objects.isNull(request.isFlag())){
if (1==request.isFlag()){
list = searchMapper.getFileDataNameAsc(keyWordList, getFileSuffix(request.getSecondType(), request.getThirdType()), request.getYear(), request.getMonth(),request.getFiletype());
PageInfo<SearchResult> pageInfo = new PageInfo<>(list);
searchResponse.setList(initSearchResultList(pageInfo.getList(), keyWordList));
searchResponse.setTotal(pageInfo.getTotal());
return searchResponse;
} if (2==request.isFlag()){
list = searchMapper.getFileDataNameDesc(keyWordList, getFileSuffix(request.getSecondType(), request.getThirdType()), request.getYear(), request.getMonth(),request.getFiletype());
PageInfo<SearchResult> pageInfo = new PageInfo<>(list);
searchResponse.setList(initSearchResultList(pageInfo.getList(), keyWordList));
searchResponse.setTotal(pageInfo.getTotal());
return searchResponse;
}
} else{
list = searchMapper.getFileData(keyWordList, getFileSuffix(request.getSecondType(), request.getThirdType()), request.getYear(), request.getMonth(),request.getFiletype());
}
}
// 查功能
if (request.getFirstType() == 3) {
list = searchMapper.getFuncData(keyWordList);
}
String filter =request.getKeyWord();
/**
* 字符串的list
*/
List<SearchResult> filterList = new ArrayList<SearchResult>();
for (SearchResult ss :list){
System.out.println(ss.getName());
}
filterList = SortByIndex(list,filter);
// List listTOsort = SortByLength(str, filterList.size());
/**
* 按照时间格式升序
* */
if (request.getFirstType() == 2) {
if (!Objects.equals(“desc”, request.getDateSort())) {
filterList = filterList.stream().sorted((a, b) -> {
return a.getCreateDate().compareTo(b.getCreateDate());
}).collect(Collectors.toList());
} else if (!Objects.equals("asc", request.getDateSort())) {
{
filterList = filterList.stream().sorted((a, b) -> {
return b.getCreateDate().compareTo(a.getCreateDate());
}).collect(Collectors.toList());
}
}
}
PageInfo<SearchResult> pageInfo = new PageInfo<>(filterList);
searchResponse.setList(initSearchResultList(pageInfo.getList(), keyWordList));
searchResponse.setTotal(pageInfo.getTotal());
return searchResponse;
}
/**
* 获取文件后缀查询条件
* @Author: zhangzm
* @Date: 2021-12-22
* @Modified by:
* @param oneType
* @param twoType
* @return: java.lang.String
*/
public String getFileSuffix(Integer oneType, Integer twoType) {
String fileSuffix = "";
if (oneType == 1) { // 图片
fileSuffix = "png,bmp,jpg,jpeg";
if (twoType == 1) {
fileSuffix = "png";
} else if (twoType == 2) {
fileSuffix = "bmp";
} else if (twoType == 3) {
fileSuffix = "jpg";
} else if (twoType == 4) {
fileSuffix = "jpeg";
}
} else if (oneType == 2) {// 视频
fileSuffix = "mp4";
} else if (oneType == 3) {// 文件
fileSuffix = "doc,docx,pdf,ppt,xls,xlsx,txt";
if (twoType == 1) {
fileSuffix = "doc,docx";
} else if (twoType == 2) {
fileSuffix = "pdf";
} else if (twoType == 3) {
fileSuffix = "ppt";
} else if (twoType == 4) {
fileSuffix = "xls,xlsx";
} else if (twoType == 5) {
fileSuffix = "txt";
}
}
fileSuffix = "'" + fileSuffix.replace(",","','") + "'";
return fileSuffix;
}
/**
* 若searchResultList中的对象包含有keywordList中的文字,则将对象中的改文字加上标签
* 前端进行加红、高亮显示该文字
* @Author: zhangzm
* @Date: 2021-12-21
* @Modified by:
* @param searchResultList
* @param keywordList
* @return: void
*/
public List<SearchResult> initSearchResultList(List<SearchResult> searchResultList, List<String> keywordList) {
List<SearchResult> list = new ArrayList<>();
if (searchResultList != null && searchResultList.size() > 0) {
searchResultList.forEach(t -> {
if (keywordList != null && keywordList.size() > 0) {
keywordList.forEach(k -> {
t.setDescription(t.getDescription() != null ? addSpan(t.getDescription(), k) : "");
t.setAddress(t.getAddress() != null ? addSpan(t.getAddress(), k) : "");
t.setName(t.getName() != null ? addSpan(t.getName(), k) : "");
t.setQyname(t.getQyname() != null ? addSpan(t.getQyname(), k) : "");
t.setSolution(t.getSolution() != null ? addSpan(t.getSolution(), k) : "");
t.setReason(t.getReason() != null ? addSpan(t.getReason(), k) : "");
t.setCategoryname(t.getCategoryname() != null ? addSpan(t.getCategoryname(), k) : "");
t.setLevelname(t.getLevelname() != null ? addSpan(t.getLevelname(), k) : "");
});
}
list.add(t);
});
}
return list;
}
/**
* 为字符串msg中的key添加span标签
* @Author: zhangzm
* @Date: 2021-12-23
* @Modified by:
* @param msg
* @return: java.lang.String
*/
public String addSpan(String msg, String key) {
return msg.replace(key, "<span style='color:red'>" + key + "</span>");
}
static List SortByLength(String[][] strs,int size) {
// TODO Auto-generated method stub
//要检索字符串长度
for(int i = 0;i<size;i++){
//该行字符串长度
int minlen = strs[i][1].length();
int min = Integer.parseInt(strs[i][2]);
String str = strs[i][1];
int minindex = i;
String sortindex = strs[i][0];
for(int j = i+1;j<strs.length;j++){
//if(str.indexOf(filter)==tempstr.indexOf(filter)&&a[j][0].length()<minlen){
//如果索引相同
if(strs[i][2].equals(strs[j][2])){
//如果剩下的字符串的长度小于上一个字符串的长度
if(strs[j][1].length() <strs[minindex][1].length()){
minlen = strs[j][1].length();
min = Integer.parseInt(strs[j][2]);
str = strs[j][1];
sortindex = strs[j][0];
minindex = j;
}
}
}
if(i != minindex){
//交换索引位置
strs[minindex][2] = strs[i][2];
strs[i][2] = String.valueOf(min);
//交换字符串位置
strs[minindex][1] = strs[i][1];
strs[i][1] = str;
//交换次数位置
strs[minindex][0] = strs[i][0];
strs[i][0] = sortindex;
}
}
System.out.println("=================================");
for(int i = 0;i<size;i++){
//查询到的结果集的第i条数据
System.out.println(strs[i][1]);
}
return java.util.Arrays.asList(strs);
}
/**
* 根据关键字的索引带大小进行排序
* @param filterList 包含关键字的list字符数组
* @param filter 关键字
* @return 三维字符数组,第一位是原始顺序,第二维是字符串,第三维是索引
*/
static List<SearchResult> SortByIndex(List<SearchResult> filterList,String filter){
int size = filterList.size();
// 索引位置
String[][] strs = new String[size][3];
for(int i = 0;i<size;i++){
//查询到的结果集的第i条数据
String str = filterList.get(i).getName().toString();
int index= str.indexOf(filter.toUpperCase());
strs[i][0] = String.valueOf(i);
strs[i][2] = String.valueOf(index);
strs[i][1] = str;
filterList.get(i).setIndex(index);
filterList.get(i).setSort(i);
System.out.println(str+"-索引是"+ str.indexOf(filter)+" 排序是"+i);
}
filterList.sort((x,y)->Integer.compare(x.getSort(),y.getSort()));
Collections.sort(filterList, new Comparator<SearchResult>() {
@Override
public int compare(SearchResult o1, SearchResult o2) {
//升序
return o1.getIndex().compareTo(o2.getIndex());
}
});
for (SearchResult ss :filterList){
System.out.println(ss.getIndex()+"qq"+ss.getSort());
}
System.out.println(filterList.toString());
return filterList;
}
}