Commit dbbc8b60 by 黄明步

修改导出年月日数据相关

parent cd4e8948
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
<elasticsearch.version>8.9.1</elasticsearch.version> <elasticsearch.version>8.9.1</elasticsearch.version>
<alibaba.druid.version>1.1.22</alibaba.druid.version> <alibaba.druid.version>1.1.22</alibaba.druid.version>
<jackson.version>2.12.3</jackson.version> <jackson.version>2.12.3</jackson.version>
<easyexcel.version>3.2.1</easyexcel.version>
</properties> </properties>
<dependencyManagement> <dependencyManagement>
<dependencies> <dependencies>
...@@ -125,25 +126,6 @@ ...@@ -125,25 +126,6 @@
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId> <artifactId>commons-pool2</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
...@@ -210,6 +192,12 @@ ...@@ -210,6 +192,12 @@
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyexcel.version}</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
package com.gxmailu.ocrCloudPlatform.excel.converter;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.gxmailu.ocrCloudPlatform.entity.ConfigAbility;
import com.gxmailu.ocrCloudPlatform.service.ConfigAbilityService;
import java.util.List;
/**
* 识别能力名称转换器
*
* @author Hmb
* @version 1.0.0
* @since 2024/1/21 14:35:30
*/
public class AbilityNameConverter implements Converter<Long> {
/**
* Convert Java objects to excel objects
*
* @param value Java Data.NotNull.
* @param contentProperty Content property.Nullable.
* @param globalConfiguration Global configuration.NotNull.
* @return Data to put into a Excel
*/
@Override
public WriteCellData<?> convertToExcelData(Long value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
ConfigAbilityService abilityService = SpringUtil.getBean(ConfigAbilityService.class);
List<ConfigAbility> abilityList = abilityService.selectAll();
for (ConfigAbility configAbility : abilityList) {
if (configAbility.getId().equals(value.toString())) {
String name = configAbility.getName();
return new WriteCellData<>(StrUtil.isNotBlank(name) ? name : "未知");
}
}
return new WriteCellData<>("未知");
}
}
package com.gxmailu.ocrCloudPlatform.excel.converter;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.gxmailu.ocrCloudPlatform.entity.Court;
import com.gxmailu.ocrCloudPlatform.service.CourtService;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
/**
* 法院名称转换器
*
* @author Hmb
* @version 1.0.0
* @since 2024/1/21 14:35:30
*/
public class CourtNameConverter implements Converter<String> {
/**
* Convert Java objects to excel objects
*
* @param value Java Data.NotNull.
* @param contentProperty Content property.Nullable.
* @param globalConfiguration Global configuration.NotNull.
* @return Data to put into a Excel
*/
@Override
public WriteCellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
CourtService courtService = SpringUtil.getBean(CourtService.class);
List<Court> courtList = courtService.getCourtList();
Optional<String> resultName = courtList.stream()
.filter(court -> Arrays.stream(court.getIpScope().split(";")).anyMatch(value::contains))
.map(Court::getName)
.findFirst();
return resultName.map(WriteCellData::new).orElseGet(() -> new WriteCellData<>("未知"));
}
}
package com.gxmailu.ocrCloudPlatform.excel.converter;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.gxmailu.ocrCloudPlatform.entity.ConfigApplication;
import com.gxmailu.ocrCloudPlatform.service.ConfigApplicationService;
import java.util.List;
/**
* 调用厂商名称转换器
*
* @author Hmb
* @version 1.0.0
* @since 2024/1/21 14:35:30
*/
public class VendorNameConverter implements Converter<Long> {
/**
* Convert Java objects to excel objects
*
* @param value Java Data.NotNull.
* @param contentProperty Content property.Nullable.
* @param globalConfiguration Global configuration.NotNull.
* @return Data to put into a Excel
*/
@Override
public WriteCellData<?> convertToExcelData(Long value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
ConfigApplicationService applicationService = SpringUtil.getBean(ConfigApplicationService.class);
List<ConfigApplication> applicationList = applicationService.getConfigApplicationAll();
for (ConfigApplication configApplication : applicationList) {
if (configApplication.getId().equals(value)) {
String description = configApplication.getDescription();
return new WriteCellData<>(StrUtil.isNotBlank(description) ? description : "未知");
}
}
return new WriteCellData<>("未知");
}
}
package com.gxmailu.ocrCloudPlatform.excel.handler;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import java.util.List;
import java.util.Objects;
/**
* 自定义合并策略实现类
*
* @author Hmb
* @version 1.0.0
* @since 2024/1/21 12:44:19
*/
public class ExcelFillCellMergeStrategy implements CellWriteHandler {
/**
* 标杆列下标,根据标杆列是否合并来判断后面的单元格是否需要合并
*/
private int standardColumnIndex;
/**
* 合并行的开始下标,即从该行开始向下合并
*/
private int mergeRowIndex;
/**
* 需要合并的列下标,0开始
*/
private int[] mergeColumnIndex;
public ExcelFillCellMergeStrategy() {
}
public ExcelFillCellMergeStrategy(int standardColumnIndex, int mergeRowIndex, int[] mergeColumnIndex) {
this.standardColumnIndex = standardColumnIndex;
this.mergeRowIndex = mergeRowIndex;
this.mergeColumnIndex = mergeColumnIndex;
}
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
// 校验:如果当前是表头,或者是第一行,则不处理。
if (isHead || relativeRowIndex == 0) {
return;
}
CellWriteHandler.super.afterCellDispose(writeSheetHolder, writeTableHolder, cellDataList, cell, head, relativeRowIndex, isHead);
// 当前行
int curRowIndex = cell.getRowIndex();
// 当前列
int curColIndex = cell.getColumnIndex();
if (curRowIndex > mergeRowIndex) {
for (int columnIndex : mergeColumnIndex) {
if (curColIndex == columnIndex) {
mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
break;
}
}
}
}
private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
// 获取当前行数据
Object curData = cell.getCellType() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();
// 获取上一行数据
Row preRow = cell.getSheet().getRow(curRowIndex - 1);
if (preRow == null) {
// 当获取不到上一行数据时,使用缓存sheet中数据
preRow = writeSheetHolder.getCachedSheet().getRow(curRowIndex - 1);
}
// 获取上一行当前列数据
Object preData = null;
if (preRow != null) {
Cell preCell = preRow.getCell(curColIndex);
if (preCell != null) {
if (preCell.getCellType() == CellType.STRING) {
preData = preCell.getStringCellValue();
} else if (preCell.getCellType() == CellType.NUMERIC) {
preData = preCell.getNumericCellValue();
}
}
}
// 获取上一行标杆列数据
Cell preRowFirstCell = preRow.getCell(standardColumnIndex);
Object preRowFirstData = preRowFirstCell.getCellType() == CellType.STRING ? preRowFirstCell.getStringCellValue() : preRowFirstCell.getNumericCellValue();
// 获取本行数据
Row curRowFirst = cell.getSheet().getRow(curRowIndex);
if (curRowFirst == null) {
curRowFirst = writeSheetHolder.getCachedSheet().getRow(curRowIndex);
}
// 获取本行标杆列数据
Cell curRowFirstCell = curRowFirst.getCell(standardColumnIndex);
Object curRowFirstData = null;
if (curRowFirstCell != null) {
curRowFirstData = curRowFirstCell.getCellType() == CellType.STRING ? curRowFirstCell.getStringCellValue() : curRowFirstCell.getNumericCellValue();
}
// 当前列为标杆列并且上下两个单元格一致则合并 或者 当前列不为标杆列并且上下两个单元格一致则合并
boolean isTrue = (curColIndex == standardColumnIndex && Objects.equals(preData, curData)) || (curColIndex != standardColumnIndex && preRowFirstData.equals(curRowFirstData) && Objects.equals(preData, curData));
if (isTrue) {
Sheet sheet = writeSheetHolder.getSheet();
List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
boolean isMerged = false;
for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {
CellRangeAddress cellRangeAddr = mergeRegions.get(i);
// 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {
sheet.removeMergedRegion(i);
cellRangeAddr.setLastRow(curRowIndex);
sheet.addMergedRegion(cellRangeAddr);
isMerged = true;
}
}
// 若上一个单元格未被合并,则新增合并单元
if (!isMerged) {
CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex);
sheet.addMergedRegion(cellRangeAddress);
}
}
}
}
package com.gxmailu.ocrCloudPlatform.excel.model;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author Hmb
* @version 1.0.0
* @since 2024/1/20 21:05:04
*/
@Data
public class CallRecordModel implements Serializable {
private static final long serialVersionUID = 1L;
@ExcelIgnore
private String ip;
@ExcelIgnore
private Long applicationId;
@ExcelIgnore
private Long abilityId;
@ExcelIgnore
@ExcelProperty(value = "法院总调用次数")
private Long ipDocCount;
@ExcelIgnore
@ExcelProperty(value = "总调用次数")
private Integer callCount;
@ExcelIgnore
@ExcelProperty(value = "用户调用次数")
private Long userDocCount;
@ExcelProperty(value = "法院名称", index = 0)
private String courtName;
@ExcelProperty(value = "业务厂商", index = 1)
private String businessVendorName;
@ExcelProperty(value = "识别能力", index = 2)
private String abilityName;
@ExcelProperty(value = "调用次数", index = 3)
private long abilityDocCount;
@ExcelProperty(value = "总识别页数", index = 4)
private Integer fileCount;
}
package com.gxmailu.ocrCloudPlatform.excel.utils;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
/**
* @author Hmb
* @version 1.0.0
* @since 2024/1/20 20:54:43
*/
public class ExcelStyleUtils {
/**
* 标题样式
*
* @return WriteCellStyle
*/
public static WriteCellStyle getHeadStyle() {
// 头的策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
// 背景颜色
// headWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE1.getIndex());
// headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
// 字体
WriteFont headWriteFont = new WriteFont();
headWriteFont.setFontName("宋体");// 设置字体名字
headWriteFont.setFontHeightInPoints((short) 14);// 设置字体大小
headWriteFont.setBold(true);// 字体加粗
headWriteCellStyle.setWriteFont(headWriteFont); // 在样式用应用设置的字体;
// 样式
headWriteCellStyle.setBorderBottom(BorderStyle.THIN);// 设置底边框;
headWriteCellStyle.setBottomBorderColor((short) 0);// 设置底边框颜色;
headWriteCellStyle.setBorderLeft(BorderStyle.THIN); // 设置左边框;
headWriteCellStyle.setLeftBorderColor((short) 0);// 设置左边框颜色;
headWriteCellStyle.setBorderRight(BorderStyle.THIN);// 设置右边框;
headWriteCellStyle.setRightBorderColor((short) 0);// 设置右边框颜色;
headWriteCellStyle.setBorderTop(BorderStyle.THIN);// 设置顶边框;
headWriteCellStyle.setTopBorderColor((short) 0); // 设置顶边框颜色;
headWriteCellStyle.setWrapped(true); // 设置自动换行;
headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 设置水平对齐的样式为居中对齐;
headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 设置垂直对齐的样式为居中对齐;
headWriteCellStyle.setShrinkToFit(true);// 设置文本收缩至合适
return headWriteCellStyle;
}
/**
* 内容样式
*
* @return WriteCellStyle
*/
public static WriteCellStyle getContentStyle() {
// 内容的策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
// 背景绿色
// 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
// contentWriteCellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
// contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
// 设置字体
WriteFont contentWriteFont = new WriteFont();
contentWriteFont.setFontHeightInPoints((short) 12);// 设置字体大小
contentWriteFont.setFontName("宋体"); // 设置字体名字
contentWriteCellStyle.setWriteFont(contentWriteFont);// 在样式用应用设置的字体;
// 设置样式
contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);// 设置底边框;
contentWriteCellStyle.setBottomBorderColor((short) 0);// 设置底边框颜色;
contentWriteCellStyle.setBorderLeft(BorderStyle.THIN); // 设置左边框;
contentWriteCellStyle.setLeftBorderColor((short) 0);// 设置左边框颜色;
contentWriteCellStyle.setBorderRight(BorderStyle.THIN);// 设置右边框;
contentWriteCellStyle.setRightBorderColor((short) 0);// 设置右边框颜色;
contentWriteCellStyle.setBorderTop(BorderStyle.THIN);// 设置顶边框;
contentWriteCellStyle.setTopBorderColor((short) 0); ///设置顶边框颜色;
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 水平居中
contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
contentWriteCellStyle.setWrapped(true); // 设置自动换行;
// contentWriteCellStyle.setShrinkToFit(true);// 设置文本收缩至合适
return contentWriteCellStyle;
}
}
\ No newline at end of file
...@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.gxmailu.ocrCloudPlatform.dto.RecordDto; import com.gxmailu.ocrCloudPlatform.dto.RecordDto;
import com.gxmailu.ocrCloudPlatform.entity.AppAbilityRecordAll; import com.gxmailu.ocrCloudPlatform.entity.AppAbilityRecordAll;
import com.gxmailu.ocrCloudPlatform.entity.DeriveCallRecord; import com.gxmailu.ocrCloudPlatform.entity.DeriveCallRecord;
import com.gxmailu.ocrCloudPlatform.excel.model.CallRecordModel;
import com.gxmailu.ocrCloudPlatform.vo.Result; import com.gxmailu.ocrCloudPlatform.vo.Result;
import java.io.IOException; import java.io.IOException;
...@@ -20,7 +21,7 @@ import java.util.List; ...@@ -20,7 +21,7 @@ import java.util.List;
*/ */
public interface AppAbilityRecordAllService extends IService<AppAbilityRecordAll> { public interface AppAbilityRecordAllService extends IService<AppAbilityRecordAll> {
List<DeriveCallRecord> selectCallRecord(String yearMonthDay, String endYearMonthDay); List<CallRecordModel> selectCallRecord(String yearMonthDay, String endYearMonthDay) throws IOException;
Result addRecord(AppAbilityRecordAll recordAll); Result addRecord(AppAbilityRecordAll recordAll);
......
package com.gxmailu.ocrCloudPlatform.service; package com.gxmailu.ocrCloudPlatform.service;
import com.gxmailu.ocrCloudPlatform.entity.Court;
import com.gxmailu.ocrCloudPlatform.vo.CourtVO; import com.gxmailu.ocrCloudPlatform.vo.CourtVO;
import com.gxmailu.ocrCloudPlatform.vo.Result; import com.gxmailu.ocrCloudPlatform.vo.Result;
import java.util.List;
public interface CourtService { public interface CourtService {
Result courtPage(CourtVO courtVO); Result courtPage(CourtVO courtVO);
...@@ -17,4 +20,6 @@ public interface CourtService { ...@@ -17,4 +20,6 @@ public interface CourtService {
Result getCourtInfo(String courtCode); Result getCourtInfo(String courtCode);
List<Court> getCourtList();
} }
package com.gxmailu.ocrCloudPlatform.service.impl; package com.gxmailu.ocrCloudPlatform.service.impl;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
...@@ -16,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -16,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
@Service @Service
@Slf4j @Slf4j
...@@ -124,4 +126,18 @@ public class CourtServiceImpl implements CourtService { ...@@ -124,4 +126,18 @@ public class CourtServiceImpl implements CourtService {
} }
return getAllCourt(); return getAllCourt();
} }
@Override
public List<Court> getCourtList() {
List<Court> courtList;
Object data = redisService.getValue(RedisConstant.COURT_LIST);
if (data != null) {
courtList = JSONUtil.toList(data.toString(), Court.class);
} else {
courtList = courtMapper.selectList(new LambdaQueryWrapper<Court>().isNotNull(Court::getIpScope));
redisService.set(RedisConstant.COURT_LIST, courtList, 1L, TimeUnit.DAYS);
}
return courtList;
}
} }
...@@ -22,15 +22,18 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; ...@@ -22,15 +22,18 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.gxmailu.ocrCloudPlatform.dto.RecordDto; import com.gxmailu.ocrCloudPlatform.dto.RecordDto;
import com.gxmailu.ocrCloudPlatform.entity.AppAbilityRecord; import com.gxmailu.ocrCloudPlatform.entity.*;
import com.gxmailu.ocrCloudPlatform.entity.AppAbilityRecordAll; import com.gxmailu.ocrCloudPlatform.excel.model.CallRecordModel;
import com.gxmailu.ocrCloudPlatform.entity.Court;
import com.gxmailu.ocrCloudPlatform.entity.ServerInfo;
import com.gxmailu.ocrCloudPlatform.mapper.AppAbilityRecordAllMapper; import com.gxmailu.ocrCloudPlatform.mapper.AppAbilityRecordAllMapper;
import com.gxmailu.ocrCloudPlatform.mapper.ServerInfoMapper; import com.gxmailu.ocrCloudPlatform.mapper.ServerInfoMapper;
import com.gxmailu.ocrCloudPlatform.service.ConfigAbilityService;
import com.gxmailu.ocrCloudPlatform.service.ConfigApplicationService;
import com.gxmailu.ocrCloudPlatform.service.CourtService;
import com.gxmailu.ocrCloudPlatform.vo.BrokenLineData; import com.gxmailu.ocrCloudPlatform.vo.BrokenLineData;
import com.sun.org.apache.xpath.internal.operations.Bool;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
...@@ -54,12 +57,18 @@ public class ElasticSearchService { ...@@ -54,12 +57,18 @@ public class ElasticSearchService {
private static final Map<Character, String> SPECIAL_CHARACTERS_MAP = new HashMap<>(); private static final Map<Character, String> SPECIAL_CHARACTERS_MAP = new HashMap<>();
private static String lastIndexTime = "2023-11-18 07:00:00"; private static String lastIndexTime = "2023-05-11 07:00:00";
@Resource @Resource
private AppAbilityRecordAllMapper recordAllMapper; private AppAbilityRecordAllMapper recordAllMapper;
@Resource @Resource
private ServerInfoMapper serverInfoMapper; private ServerInfoMapper serverInfoMapper;
@Resource
private ConfigAbilityService configAbilityService;
@Resource
private ConfigApplicationService configApplicationService;
@Resource
private CourtService courtService;
static { static {
SPECIAL_CHARACTERS_MAP.put('[', "\\["); SPECIAL_CHARACTERS_MAP.put('[', "\\[");
...@@ -185,7 +194,7 @@ public class ElasticSearchService { ...@@ -185,7 +194,7 @@ public class ElasticSearchService {
// 遍历法院列表,对每一个法院ip进行前缀查询 // 遍历法院列表,对每一个法院ip进行前缀查询
courtList.forEach(court -> boolQuery.should(q -> q.prefix(pq -> pq.field("ip.keyword").value(court.getIpScope())))); courtList.forEach(court -> boolQuery.should(q -> q.prefix(pq -> pq.field("ip.keyword").value(court.getIpScope()))));
return boolQuery; return boolQuery;
// 对ip进行聚合查询 // 对ip进行聚合查询
})).aggregations("count", agg -> agg.terms(TermsAggregation.of(s -> s.field("ip.keyword")))).trackTotalHits(tb -> tb.enabled(true)), Void.class); })).aggregations("count", agg -> agg.terms(TermsAggregation.of(s -> s.field("ip.keyword")))).trackTotalHits(tb -> tb.enabled(true)), Void.class);
StringTermsAggregate stringTermsAggregate = searchResponse.aggregations() StringTermsAggregate stringTermsAggregate = searchResponse.aggregations()
...@@ -245,7 +254,7 @@ public class ElasticSearchService { ...@@ -245,7 +254,7 @@ public class ElasticSearchService {
.lt(JsonData.of(endTime)) .lt(JsonData.of(endTime))
)); ));
return boolQuery; return boolQuery;
// 聚合查询,按每一分钟为间隔查询每分钟的调用量 // 聚合查询,按每一分钟为间隔查询每分钟的调用量
})).aggregations("record", agg -> agg.dateHistogram(DateHistogramAggregation.of(s -> s.field("callTime") })).aggregations("record", agg -> agg.dateHistogram(DateHistogramAggregation.of(s -> s.field("callTime")
.calendarInterval(CalendarInterval.Minute)))).trackTotalHits(tb -> tb.enabled(true)), Void.class); .calendarInterval(CalendarInterval.Minute)))).trackTotalHits(tb -> tb.enabled(true)), Void.class);
List<DateHistogramBucket> bucketList = search.aggregations().get("record").dateHistogram().buckets().array(); List<DateHistogramBucket> bucketList = search.aggregations().get("record").dateHistogram().buckets().array();
...@@ -328,17 +337,12 @@ public class ElasticSearchService { ...@@ -328,17 +337,12 @@ public class ElasticSearchService {
// if (CollUtil.isNotEmpty(recordDto.getIpScopeList())) { // if (CollUtil.isNotEmpty(recordDto.getIpScopeList())) {
// for (String ipScope : recordDto.getIpScopeList()) { // for (String ipScope : recordDto.getIpScopeList()) {
// if (StrUtil.isNotBlank(ipScope)) { // if (StrUtil.isNotBlank(ipScope)) {
// boolQuery.filter(q -> q.prefix(pq -> pq.field("ip.keyword").value(ipScope))); // boolQuery.should(q -> q.prefix(pq -> pq.field("ip.keyword").value(ipScope)));
// } // }
// } // }
// } // }
boolQuery.must(mustQuery -> mustQuery.bool(bq -> { boolQuery.must(mustQuery -> mustQuery.bool(bq -> {
// 多个法院ip过滤
// if (CollUtil.isNotEmpty(serverIpList)) {
// List<FieldValue> collect = serverIpList.stream().map(FieldValue::of).collect(Collectors.toList());
// bq.should(mq -> mq.terms(tq -> tq.field("serverIp").terms(tqf -> tqf.value(collect))));
// }
// 多个ip前缀过滤 // 多个ip前缀过滤
if (CollUtil.isNotEmpty(recordDto.getIpScopeList())) { if (CollUtil.isNotEmpty(recordDto.getIpScopeList())) {
for (String ipScope : recordDto.getIpScopeList()) { for (String ipScope : recordDto.getIpScopeList()) {
...@@ -350,7 +354,6 @@ public class ElasticSearchService { ...@@ -350,7 +354,6 @@ public class ElasticSearchService {
return bq; return bq;
})); }));
if (ObjUtil.isNotNull(recordDto.getApplicationId())) { if (ObjUtil.isNotNull(recordDto.getApplicationId())) {
boolQuery.must(mustQuery -> mustQuery.match(mq -> mq.field("applicationId").query(recordDto.getApplicationId().toString()))); boolQuery.must(mustQuery -> mustQuery.match(mq -> mq.field("applicationId").query(recordDto.getApplicationId().toString())));
} }
...@@ -363,6 +366,68 @@ public class ElasticSearchService { ...@@ -363,6 +366,68 @@ public class ElasticSearchService {
return handlePageResultWithHighlight(searchResponse, AppAbilityRecord.class, recordDto); return handlePageResultWithHighlight(searchResponse, AppAbilityRecord.class, recordDto);
} }
public List<CallRecordModel> selectCallRecord(String yearMonthDay, String endYearMonthDay) throws IOException {
SearchResponse<Void> searchResponse = client.search(srBuilder -> srBuilder
.index(APP_ABILITY_RECORD_INDEX)
.query(queryBuilder -> queryBuilder.bool(boolQuery -> {
boolQuery.must(q -> q.range(rangeQueryBuilder -> rangeQueryBuilder
.field("callTime")
.gte(JsonData.of(yearMonthDay))
.lt(JsonData.of(endYearMonthDay))));
return boolQuery;
}))
.size(0)
// 添加聚合查询
.aggregations("ip_agg", ipAgg -> ipAgg.terms(ipTerm -> ipTerm.field("ip.keyword"))
.aggregations("applicationId_agg", applicationAgg -> applicationAgg.terms(applicationTerm -> applicationTerm.field("applicationId"))
.aggregations("ablilityId_agg", abilityAgg -> abilityAgg.terms(abilityTerm -> abilityTerm.field("abilityId"))
.aggregations("fileCount", fileCountAgg -> fileCountAgg.sum(fileCountSum -> fileCountSum.field("fileCount"))))))
.trackTotalHits(tb -> tb.enabled(true)), Void.class);
ArrayList<CallRecordModel> recordModels = new ArrayList<>();
List<Court> courtList = courtService.getCourtList();
List<ConfigAbility> abilityList = configAbilityService.selectAll();
List<ConfigApplication> applicationList = configApplicationService.getConfigApplicationAll();
searchResponse.aggregations().get("ip_agg").sterms().buckets().array().forEach(ipBucket -> {
ipBucket.aggregations().get("applicationId_agg").lterms().buckets().array().forEach(applicationIdBucket -> {
applicationIdBucket.aggregations().get("ablilityId_agg").lterms().buckets().array().forEach(abilityIdBucket -> {
int fileCount = (int) abilityIdBucket.aggregations().get("fileCount").sum().value();
CallRecordModel recordModel = new CallRecordModel();
recordModel.setIp(ipBucket.key().stringValue());
recordModel.setIpDocCount(ipBucket.docCount());
recordModel.setApplicationId(applicationIdBucket.key());
recordModel.setUserDocCount(applicationIdBucket.docCount());
recordModel.setAbilityId(abilityIdBucket.key());
recordModel.setAbilityDocCount(abilityIdBucket.docCount());
recordModel.setFileCount(fileCount);
recordModel.setCourtName(courtList.stream()
.filter(court -> Arrays.stream(court.getIpScope().split(";")).anyMatch(recordModel.getIp()::contains))
.findFirst()
.map(Court::getName)
.orElse("未知"));
recordModel.setBusinessVendorName(applicationList.stream()
.filter(application -> application.getId().equals(recordModel.getApplicationId()))
.findFirst()
.map(ConfigApplication::getDescription)
.orElse("未知"));
recordModel.setAbilityName(abilityList.stream()
.filter(ability -> ability.getId().equals(recordModel.getAbilityId().toString()))
.findFirst()
.map(ConfigAbility::getName)
.orElse("未知"));
recordModels.add(recordModel);
});
});
});
recordModels.sort(Comparator.comparing(CallRecordModel::getCourtName)
.thenComparing(CallRecordModel::getBusinessVendorName)
.thenComparing(CallRecordModel::getAbilityName).reversed());
return recordModels;
}
/** /**
......
...@@ -104,7 +104,7 @@ public class RetransmissionService { ...@@ -104,7 +104,7 @@ public class RetransmissionService {
/** /**
* 重试次数 * 重试次数
*/ */
private static final int MAX_RETRIES = 3; private static final int MAX_RETRIES = 5;
...@@ -201,6 +201,7 @@ public class RetransmissionService { ...@@ -201,6 +201,7 @@ public class RetransmissionService {
res = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/1001") res = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/1001")
.headerMap(getHeaderMap(request), true) .headerMap(getHeaderMap(request), true)
.form(paramMap) .form(paramMap)
.setConnectionTimeout(10 * 1000)
.execute().body(); .execute().body();
// 设置结束时间 // 设置结束时间
endTime = System.currentTimeMillis(); endTime = System.currentTimeMillis();
...@@ -311,6 +312,7 @@ public class RetransmissionService { ...@@ -311,6 +312,7 @@ public class RetransmissionService {
res = HttpRequest.post(ocrApi + "/ofs/api/sync/v2/1001") res = HttpRequest.post(ocrApi + "/ofs/api/sync/v2/1001")
.headerMap(getHeaderMap(request), true) .headerMap(getHeaderMap(request), true)
.form(paramMap) .form(paramMap)
.setConnectionTimeout(10 * 1000)
.execute().body(); .execute().body();
// 设置结束时间 // 设置结束时间
endTime = System.currentTimeMillis(); endTime = System.currentTimeMillis();
...@@ -357,6 +359,7 @@ public class RetransmissionService { ...@@ -357,6 +359,7 @@ public class RetransmissionService {
HttpResponse httpResponse = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/pdf") HttpResponse httpResponse = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/pdf")
.headerMap(getHeaderMap(request), true) .headerMap(getHeaderMap(request), true)
.contentType("application/json;charset=UTF-8") .contentType("application/json;charset=UTF-8")
.setConnectionTimeout(10 * 1000)
.body(body.toJSONString(0)).execute(); .body(body.toJSONString(0)).execute();
Map<String, List<String>> headers = httpResponse.headers(); Map<String, List<String>> headers = httpResponse.headers();
...@@ -417,7 +420,6 @@ public class RetransmissionService { ...@@ -417,7 +420,6 @@ public class RetransmissionService {
} }
} catch (Exception e) { } catch (Exception e) {
log.error("在处理ID为 {} 的PDF下载过程中发生异常", id, e); log.error("在处理ID为 {} 的PDF下载过程中发生异常", id, e);
// returnError(response, 500, "OCR云平台接口异常");
} }
} }
...@@ -432,6 +434,7 @@ public class RetransmissionService { ...@@ -432,6 +434,7 @@ public class RetransmissionService {
HttpResponse httpResponse = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/ofd") HttpResponse httpResponse = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/ofd")
.headerMap(getHeaderMap(request), true) .headerMap(getHeaderMap(request), true)
.contentType("application/json;charset=UTF-8") .contentType("application/json;charset=UTF-8")
.setConnectionTimeout(10 * 1000)
.body(body.toJSONString(0)).execute(); .body(body.toJSONString(0)).execute();
Map<String, List<String>> headers = httpResponse.headers(); Map<String, List<String>> headers = httpResponse.headers();
if (!headers.isEmpty()) { if (!headers.isEmpty()) {
...@@ -490,7 +493,6 @@ public class RetransmissionService { ...@@ -490,7 +493,6 @@ public class RetransmissionService {
} }
} catch (Exception e) { } catch (Exception e) {
log.error("在处理ID为 {} 的PDF下载过程中发生异常", id, e); log.error("在处理ID为 {} 的PDF下载过程中发生异常", id, e);
// returnError(response, 500, "OCR云平台接口异常");
} }
} }
...@@ -530,6 +532,7 @@ public class RetransmissionService { ...@@ -530,6 +532,7 @@ public class RetransmissionService {
res = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/ft/1001") res = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/ft/1001")
.headerMap(getHeaderMap(request), true) .headerMap(getHeaderMap(request), true)
.form(paramMap) .form(paramMap)
.setConnectionTimeout(10 * 1000)
.execute().body(); .execute().body();
// 设置结束时间 // 设置结束时间
endTime = System.currentTimeMillis(); endTime = System.currentTimeMillis();
...@@ -600,6 +603,7 @@ public class RetransmissionService { ...@@ -600,6 +603,7 @@ public class RetransmissionService {
res = HttpRequest.post(ocrApi + "/ofs/api/sync/v2/1001") res = HttpRequest.post(ocrApi + "/ofs/api/sync/v2/1001")
.headerMap(getHeaderMap(request), true) .headerMap(getHeaderMap(request), true)
.form(paramMap) .form(paramMap)
.setConnectionTimeout(10 * 1000)
.execute().body(); .execute().body();
// 设置结束时间 // 设置结束时间
endTime = System.currentTimeMillis(); endTime = System.currentTimeMillis();
...@@ -658,6 +662,7 @@ public class RetransmissionService { ...@@ -658,6 +662,7 @@ public class RetransmissionService {
String res = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/kv/" + code) String res = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/kv/" + code)
.headerMap(getHeaderMap(request), true) .headerMap(getHeaderMap(request), true)
.form(paramMap) .form(paramMap)
.setConnectionTimeout(10 * 1000)
.execute().body(); .execute().body();
// 设置结束时间 // 设置结束时间
long endTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis();
...@@ -705,6 +710,7 @@ public class RetransmissionService { ...@@ -705,6 +710,7 @@ public class RetransmissionService {
String res = HttpRequest.post(ocrApi + "/ofs/api/async/minio/v1/" + code) String res = HttpRequest.post(ocrApi + "/ofs/api/async/minio/v1/" + code)
.headerMap(getHeaderMap(request), true) .headerMap(getHeaderMap(request), true)
.contentType("application/json;charset=UTF-8") .contentType("application/json;charset=UTF-8")
.setConnectionTimeout(10 * 1000)
.body(body.toJSONString(0)).execute().body(); .body(body.toJSONString(0)).execute().body();
// 设置结束时间 // 设置结束时间
long endTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis();
...@@ -747,6 +753,7 @@ public class RetransmissionService { ...@@ -747,6 +753,7 @@ public class RetransmissionService {
String res = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/6002") String res = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/6002")
.headerMap(getHeaderMap(request), true) .headerMap(getHeaderMap(request), true)
.form(paramMap) .form(paramMap)
.setConnectionTimeout(10 * 1000)
.execute().body(); .execute().body();
// 设置结束时间 // 设置结束时间
long endTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis();
...@@ -791,9 +798,8 @@ public class RetransmissionService { ...@@ -791,9 +798,8 @@ public class RetransmissionService {
addServerRequestCount(ocrServerAddress.getIp(), 1); addServerRequestCount(ocrServerAddress.getIp(), 1);
String ocrApi = "http://" + ocrServerAddress.getIp() + ":" + ocrServerAddress.getOcrPort(); String ocrApi = "http://" + ocrServerAddress.getIp() + ":" + ocrServerAddress.getOcrPort();
HttpResponse httpResponse = HttpRequest.post(ocrApi + "/ofs/api/file/convert") HttpResponse httpResponse = HttpRequest.post(ocrApi + "/ofs/api/file/convert")
.header("Authorization", request.getHeader("Authorization")) .headerMap(getHeaderMap(request), true)
.header("X-Timestamp", request.getHeader("X-Timestamp")) .setConnectionTimeout(10 * 1000)
.header("X-Checksum", request.getHeader("X-Checksum"))
.contentType(ContentType.MULTIPART.getValue()) .contentType(ContentType.MULTIPART.getValue())
.form(paramMap).execute(); .form(paramMap).execute();
...@@ -848,28 +854,28 @@ public class RetransmissionService { ...@@ -848,28 +854,28 @@ public class RetransmissionService {
// 保存到ES // 保存到ES
elasticSearchService.recordDataImport(Collections.singletonList(record)); elasticSearchService.recordDataImport(Collections.singletonList(record));
// log.info("修改id:{}的真实客户端请求ip结果:{}", id, mapper.updateById(record)); // // log.info("修改id:{}的真实客户端请求ip结果:{}", id, mapper.updateById(record));
AppAbilityRecordAll recordAll = recordAllMapper.selectById(id); // AppAbilityRecordAll recordAll = recordAllMapper.selectById(id);
if (recordAll == null) { // if (recordAll == null) {
recordAll = new AppAbilityRecordAll(); // recordAll = new AppAbilityRecordAll();
BeanUtils.copyProperties(record, recordAll, AppAbilityRecordAll.class); // BeanUtils.copyProperties(record, recordAll, AppAbilityRecordAll.class);
recordAll.setCreatedTime(DateUtil.date()); // recordAll.setCreatedTime(DateUtil.date());
recordAll.setUpdatedTime(DateUtil.date()); // recordAll.setUpdatedTime(DateUtil.date());
if (StrUtil.isEmpty(recordAll.getServerIp())) { // if (StrUtil.isEmpty(recordAll.getServerIp())) {
recordAll.setServerIp(serverIp); // recordAll.setServerIp(serverIp);
} // }
recordAllMapper.insert(recordAll); // recordAllMapper.insert(recordAll);
// log.info("添加id:{} 的数据到recordAll持久化保存结果:{}", recordAll.getId(), recordAllMapper.insert(recordAll)); // // log.info("添加id:{} 的数据到recordAll持久化保存结果:{}", recordAll.getId(), recordAllMapper.insert(recordAll));
} else { // } else {
AppAbilityRecordAll newRecordAll = new AppAbilityRecordAll(); // AppAbilityRecordAll newRecordAll = new AppAbilityRecordAll();
BeanUtils.copyProperties(record, newRecordAll, AppAbilityRecordAll.class); // BeanUtils.copyProperties(record, newRecordAll, AppAbilityRecordAll.class);
newRecordAll.setUpdatedTime(DateUtil.date()); // newRecordAll.setUpdatedTime(DateUtil.date());
if (StrUtil.isEmpty(newRecordAll.getServerIp())) { // if (StrUtil.isEmpty(newRecordAll.getServerIp())) {
newRecordAll.setServerIp(serverIp); // newRecordAll.setServerIp(serverIp);
} // }
recordAllMapper.updateById(newRecordAll); // recordAllMapper.updateById(newRecordAll);
// log.info("修改recordAll中id:{} 的数据结果:{}", newRecordAll.getId(), recordAllMapper.updateById(newRecordAll)); // // log.info("修改recordAll中id:{} 的数据结果:{}", newRecordAll.getId(), recordAllMapper.updateById(newRecordAll));
} // }
} }
......
...@@ -13,15 +13,26 @@ import co.elastic.clients.elasticsearch._types.aggregations.*; ...@@ -13,15 +13,26 @@ import co.elastic.clients.elasticsearch._types.aggregations.*;
import co.elastic.clients.elasticsearch.core.SearchResponse; import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.TotalHits; import co.elastic.clients.elasticsearch.core.search.TotalHits;
import co.elastic.clients.json.JsonData; import co.elastic.clients.json.JsonData;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gxmailu.ocrCloudPlatform.constant.RedisConstant; import com.gxmailu.ocrCloudPlatform.constant.RedisConstant;
import com.gxmailu.ocrCloudPlatform.dto.RecordDto; import com.gxmailu.ocrCloudPlatform.dto.RecordDto;
import com.gxmailu.ocrCloudPlatform.entity.AppAbilityRecord; import com.gxmailu.ocrCloudPlatform.entity.AppAbilityRecord;
import com.gxmailu.ocrCloudPlatform.entity.ConfigAbility;
import com.gxmailu.ocrCloudPlatform.entity.ConfigApplication;
import com.gxmailu.ocrCloudPlatform.entity.Court; import com.gxmailu.ocrCloudPlatform.entity.Court;
import com.gxmailu.ocrCloudPlatform.excel.handler.ExcelFillCellMergeStrategy;
import com.gxmailu.ocrCloudPlatform.excel.model.CallRecordModel;
import com.gxmailu.ocrCloudPlatform.excel.utils.ExcelStyleUtils;
import com.gxmailu.ocrCloudPlatform.mapper.AppAbilityRecordAllMapper; import com.gxmailu.ocrCloudPlatform.mapper.AppAbilityRecordAllMapper;
import com.gxmailu.ocrCloudPlatform.mapper.CourtMapper; import com.gxmailu.ocrCloudPlatform.mapper.CourtMapper;
import com.gxmailu.ocrCloudPlatform.service.AppAbilityRecordAllService; import com.gxmailu.ocrCloudPlatform.service.AppAbilityRecordAllService;
import com.gxmailu.ocrCloudPlatform.service.ConfigAbilityService;
import com.gxmailu.ocrCloudPlatform.service.ConfigApplicationService;
import com.gxmailu.ocrCloudPlatform.service.CourtService;
import com.gxmailu.ocrCloudPlatform.service.impl.ElasticSearchService; import com.gxmailu.ocrCloudPlatform.service.impl.ElasticSearchService;
import com.gxmailu.ocrCloudPlatform.service.impl.RedisService; import com.gxmailu.ocrCloudPlatform.service.impl.RedisService;
import com.gxmailu.ocrCloudPlatform.vo.BrokenLineData; import com.gxmailu.ocrCloudPlatform.vo.BrokenLineData;
...@@ -60,6 +71,12 @@ public class ESTest { ...@@ -60,6 +71,12 @@ public class ESTest {
private ElasticSearchService elasticSearchService; private ElasticSearchService elasticSearchService;
@Autowired @Autowired
private AppAbilityRecordAllService appAbilityRecordAllService; private AppAbilityRecordAllService appAbilityRecordAllService;
@Autowired
private ConfigAbilityService configAbilityService;
@Autowired
private ConfigApplicationService configApplicationService;
@Autowired
private CourtService courtService;
@Test @Test
public void getCourtUseByYear() throws IOException { public void getCourtUseByYear() throws IOException {
...@@ -154,7 +171,7 @@ public class ESTest { ...@@ -154,7 +171,7 @@ public class ESTest {
RecordDto recordDto = new RecordDto(); RecordDto recordDto = new RecordDto();
recordDto.setPage(1); recordDto.setPage(1);
recordDto.setLimit(10); recordDto.setLimit(10);
// recordDto.setIpScopeList(Arrays.asList("147.4.")); recordDto.setIpScopeList(Arrays.asList("147.4.", "147.72."));
// recordDto.setApplicationId(5L); // recordDto.setApplicationId(5L);
// recordDto.setStartTime(DateUtil.parseDate("2023-05-11")); // recordDto.setStartTime(DateUtil.parseDate("2023-05-11"));
// recordDto.setEndTime(DateUtil.parseDate("2023-05-11")); // recordDto.setEndTime(DateUtil.parseDate("2023-05-11"));
...@@ -305,4 +322,92 @@ public class ESTest { ...@@ -305,4 +322,92 @@ public class ESTest {
} }
return courtMapper.selectOne(new LambdaQueryWrapper<Court>().eq(Court::getName, courtName)); return courtMapper.selectOne(new LambdaQueryWrapper<Court>().eq(Court::getName, courtName));
} }
public List<CallRecordModel> getAggregatedData() throws IOException {
String start = "2023-11-24 00:00:00";
String end = "2023-11-24 23:59:59";
// 添加聚合
SearchResponse<Void> searchResponse = client.search(srBuilder -> srBuilder
.index(APP_ABILITY_RECORD_INDEX)
.query(queryBuilder -> queryBuilder.bool(boolQuery -> {
boolQuery.must(q -> q.range(rangeQueryBuilder -> rangeQueryBuilder
.field("callTime")
.gte(JsonData.of(start))
.lt(JsonData.of(end))));
return boolQuery;
}))
.size(0)
.aggregations("ip_agg", ipAgg -> ipAgg.terms(ipTerm -> ipTerm.field("ip.keyword"))
.aggregations("applicationId_agg", applicationAgg -> applicationAgg.terms(applicationTerm -> applicationTerm.field("applicationId"))
.aggregations("ablilityId_agg", abilityAgg -> abilityAgg.terms(abilityTerm -> abilityTerm.field("abilityId"))
.aggregations("fileCount", fileCountAgg -> fileCountAgg.sum(fileCountSum -> fileCountSum.field("fileCount"))))))
.trackTotalHits(tb -> tb.enabled(true)),
Void.class);
ArrayList<CallRecordModel> recordModels = new ArrayList<>();
List<Court> courtList = courtService.getCourtList();
List<ConfigAbility> abilityList = configAbilityService.selectAll();
List<ConfigApplication> applicationList = configApplicationService.getConfigApplicationAll();
searchResponse.aggregations().get("ip_agg").sterms().buckets().array().forEach(ipBucket -> {
ipBucket.aggregations().get("applicationId_agg").lterms().buckets().array().forEach(applicationIdBucket -> {
applicationIdBucket.aggregations().get("ablilityId_agg").lterms().buckets().array().forEach(abilityIdBucket -> {
int fileCount = (int) abilityIdBucket.aggregations().get("fileCount").sum().value();
CallRecordModel recordModel = new CallRecordModel();
recordModel.setIp(ipBucket.key().stringValue());
recordModel.setIpDocCount(ipBucket.docCount());
recordModel.setApplicationId(applicationIdBucket.key());
recordModel.setUserDocCount(applicationIdBucket.docCount());
recordModel.setAbilityId(abilityIdBucket.key());
recordModel.setAbilityDocCount(abilityIdBucket.docCount());
recordModel.setFileCount(fileCount);
recordModel.setCourtName(courtList.stream()
.filter(court -> Arrays.stream(court.getIpScope().split(";")).anyMatch(recordModel.getIp()::contains))
.findFirst()
.map(Court::getName)
.orElse("未知"));
recordModel.setBusinessVendorName(applicationList.stream()
.filter(application -> application.getId().equals(recordModel.getApplicationId()))
.findFirst()
.map(ConfigApplication::getDescription)
.orElse("未知"));
recordModel.setAbilityName(abilityList.stream()
.filter(ability -> ability.getId().equals(recordModel.getAbilityId().toString()))
.findFirst()
.map(ConfigAbility::getName)
.orElse("未知"));
recordModels.add(recordModel);
});
});
});
recordModels.sort(Comparator.comparing(CallRecordModel::getCourtName)
.thenComparing(CallRecordModel::getBusinessVendorName)
.thenComparing(CallRecordModel::getAbilityName).reversed());
recordModels.forEach(System.out::println);
return recordModels;
}
@Test
public void testExport() throws IOException {
// 设置单元格样式
HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(ExcelStyleUtils.getHeadStyle(), ExcelStyleUtils.getContentStyle());
// 获取:用户信息列表。
List<CallRecordModel> list = this.getAggregatedData();
// 处理:导出数据。
EasyExcel.write("D:\\data\\export.xlsx")
.sheet("导出数据")
.head(CallRecordModel.class)
// 自动行宽策略
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
// 自定义合并策略
// .registerWriteHandler(new CustomMergeStrategy(Arrays.asList("courtName", "businessVendorName")))
.registerWriteHandler(new ExcelFillCellMergeStrategy(0, 0, new int[]{0, 1}))
// 设置单元格样式
.registerWriteHandler(horizontalCellStyleStrategy)
.doWrite(list);
}
} }
package com.gxmailu.ocrCloudPlatform;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.util.DateUtils;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.gxmailu.ocrCloudPlatform.excel.handler.ExcelFillCellMergeStrategy;
import com.gxmailu.ocrCloudPlatform.excel.model.CallRecordModel;
import com.gxmailu.ocrCloudPlatform.excel.utils.ExcelStyleUtils;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* EasyExcel 测试类。
*
* @author 张德龙
*/
@Slf4j
public class EasyExcelTest {
/**
* 测试:模型映射导出。
*/
@Test
@SneakyThrows
public void testExport() {
// 设置单元格样式
HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(ExcelStyleUtils.getHeadStyle(), ExcelStyleUtils.getContentStyle());
// 获取:用户信息列表。
List<CallRecordModel> list = new ArrayList<>();
// 处理:导出数据。
EasyExcel.write("D:\\data\\export.xlsx")
.sheet("导出数据")
.head(CallRecordModel.class)
// 自动行宽策略
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
// 自定义合并策略
.registerWriteHandler(new ExcelFillCellMergeStrategy(0, 0, new int[]{0, 1, 2}))
// 设置单元格样式
.registerWriteHandler(horizontalCellStyleStrategy)
.doWrite(list);
}
// private List<RecordModel> getRecordList() {
// RecordModel recordModel = new RecordModel();
// recordModel.setCourtName("广西壮族自治区高级人民法院");
// recordModel.setBusinessVendorName("华宇");
// recordModel.setAbilityName("通用文字识别");
// recordModel.setCallCount(18);
// recordModel.setFileCount(55);
// RecordModel recordModel00 = new RecordModel();
// recordModel00.setCourtName("广西壮族自治区高级人民法院");
// recordModel00.setBusinessVendorName("华宇");
// recordModel00.setAbilityName("通用文字识别");
// recordModel00.setCallCount(18);
// recordModel00.setFileCount(55);
// RecordModel recordModel1 = new RecordModel();
// recordModel1.setCourtName("广西壮族自治区高级人民法院");
// recordModel1.setBusinessVendorName("华宇");
// recordModel1.setAbilityName("表格文字识别");
// recordModel1.setCallCount(14);
// recordModel1.setFileCount(33);
// RecordModel recordModel2 = new RecordModel();
// recordModel2.setCourtName("广西壮族自治区高级人民法院");
// recordModel2.setBusinessVendorName("北投");
// recordModel2.setAbilityName("通用文字识别");
// recordModel2.setCallCount(423);
// recordModel2.setFileCount(3222);
// RecordModel recordModel3 = new RecordModel();
// recordModel3.setCourtName("南宁市中级人民法院");
// recordModel3.setBusinessVendorName("通达海");
// recordModel3.setAbilityName("通用文字识别");
// recordModel3.setCallCount(323);
// recordModel3.setFileCount(444);
// RecordModel recordModel4 = new RecordModel();
// recordModel4.setCourtName("南宁市中级人民法院");
// recordModel4.setBusinessVendorName("通达海");
// recordModel4.setAbilityName("表格文字识别");
// recordModel4.setCallCount(111);
// recordModel4.setFileCount(333);
// RecordModel recordModel5 = new RecordModel();
// recordModel5.setCourtName("北海市中级人民法院");
// recordModel5.setBusinessVendorName("通达海");
// recordModel5.setAbilityName("通用文字识别");
// recordModel5.setCallCount(23);
// recordModel5.setFileCount(111);
// RecordModel recordModel6 = new RecordModel();
// recordModel6.setCourtName("梧州市中级人民法院");
// recordModel6.setBusinessVendorName("北投");
// recordModel6.setAbilityName("通用文字识别");
// recordModel6.setCallCount(23);
// recordModel6.setFileCount(111);
//
// List<RecordModel> list = new ArrayList<>(Arrays.asList(recordModel, recordModel00, recordModel1, recordModel2, recordModel3, recordModel4, recordModel5, recordModel6));
// RecordModel totalRow = new RecordModel();
// totalRow.setCourtName("总计");
// totalRow.setCallCount(list.stream().mapToInt(RecordModel::getCallCount).sum());
// totalRow.setFileCount(list.stream().mapToInt(RecordModel::getFileCount).sum());
// list.add(totalRow);
// return list;
// }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment