Commit dbbc8b60 by 黄明步

修改导出年月日数据相关

parent cd4e8948
......@@ -22,6 +22,7 @@
<elasticsearch.version>8.9.1</elasticsearch.version>
<alibaba.druid.version>1.1.22</alibaba.druid.version>
<jackson.version>2.12.3</jackson.version>
<easyexcel.version>3.2.1</easyexcel.version>
</properties>
<dependencyManagement>
<dependencies>
......@@ -125,25 +126,6 @@
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</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>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
......@@ -210,6 +192,12 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyexcel.version}</version>
</dependency>
</dependencies>
<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;
import com.gxmailu.ocrCloudPlatform.dto.RecordDto;
import com.gxmailu.ocrCloudPlatform.entity.AppAbilityRecordAll;
import com.gxmailu.ocrCloudPlatform.entity.DeriveCallRecord;
import com.gxmailu.ocrCloudPlatform.excel.model.CallRecordModel;
import com.gxmailu.ocrCloudPlatform.vo.Result;
import java.io.IOException;
......@@ -20,7 +21,7 @@ import java.util.List;
*/
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);
......
package com.gxmailu.ocrCloudPlatform.service;
import com.gxmailu.ocrCloudPlatform.entity.Court;
import com.gxmailu.ocrCloudPlatform.vo.CourtVO;
import com.gxmailu.ocrCloudPlatform.vo.Result;
import java.util.List;
public interface CourtService {
Result courtPage(CourtVO courtVO);
......@@ -17,4 +20,6 @@ public interface CourtService {
Result getCourtInfo(String courtCode);
List<Court> getCourtList();
}
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.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
......@@ -16,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.concurrent.TimeUnit;
@Service
@Slf4j
......@@ -124,4 +126,18 @@ public class CourtServiceImpl implements CourtService {
}
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;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gxmailu.ocrCloudPlatform.dto.RecordDto;
import com.gxmailu.ocrCloudPlatform.entity.AppAbilityRecord;
import com.gxmailu.ocrCloudPlatform.entity.AppAbilityRecordAll;
import com.gxmailu.ocrCloudPlatform.entity.Court;
import com.gxmailu.ocrCloudPlatform.entity.ServerInfo;
import com.gxmailu.ocrCloudPlatform.entity.*;
import com.gxmailu.ocrCloudPlatform.excel.model.CallRecordModel;
import com.gxmailu.ocrCloudPlatform.mapper.AppAbilityRecordAllMapper;
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.sun.org.apache.xpath.internal.operations.Bool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
......@@ -54,12 +57,18 @@ public class ElasticSearchService {
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
private AppAbilityRecordAllMapper recordAllMapper;
@Resource
private ServerInfoMapper serverInfoMapper;
@Resource
private ConfigAbilityService configAbilityService;
@Resource
private ConfigApplicationService configApplicationService;
@Resource
private CourtService courtService;
static {
SPECIAL_CHARACTERS_MAP.put('[', "\\[");
......@@ -185,7 +194,7 @@ public class ElasticSearchService {
// 遍历法院列表,对每一个法院ip进行前缀查询
courtList.forEach(court -> boolQuery.should(q -> q.prefix(pq -> pq.field("ip.keyword").value(court.getIpScope()))));
return boolQuery;
// 对ip进行聚合查询
// 对ip进行聚合查询
})).aggregations("count", agg -> agg.terms(TermsAggregation.of(s -> s.field("ip.keyword")))).trackTotalHits(tb -> tb.enabled(true)), Void.class);
StringTermsAggregate stringTermsAggregate = searchResponse.aggregations()
......@@ -245,7 +254,7 @@ public class ElasticSearchService {
.lt(JsonData.of(endTime))
));
return boolQuery;
// 聚合查询,按每一分钟为间隔查询每分钟的调用量
// 聚合查询,按每一分钟为间隔查询每分钟的调用量
})).aggregations("record", agg -> agg.dateHistogram(DateHistogramAggregation.of(s -> s.field("callTime")
.calendarInterval(CalendarInterval.Minute)))).trackTotalHits(tb -> tb.enabled(true)), Void.class);
List<DateHistogramBucket> bucketList = search.aggregations().get("record").dateHistogram().buckets().array();
......@@ -328,17 +337,12 @@ public class ElasticSearchService {
// if (CollUtil.isNotEmpty(recordDto.getIpScopeList())) {
// for (String ipScope : recordDto.getIpScopeList()) {
// 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 -> {
// 多个法院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前缀过滤
if (CollUtil.isNotEmpty(recordDto.getIpScopeList())) {
for (String ipScope : recordDto.getIpScopeList()) {
......@@ -350,7 +354,6 @@ public class ElasticSearchService {
return bq;
}));
if (ObjUtil.isNotNull(recordDto.getApplicationId())) {
boolQuery.must(mustQuery -> mustQuery.match(mq -> mq.field("applicationId").query(recordDto.getApplicationId().toString())));
}
......@@ -363,6 +366,68 @@ public class ElasticSearchService {
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 {
/**
* 重试次数
*/
private static final int MAX_RETRIES = 3;
private static final int MAX_RETRIES = 5;
......@@ -201,6 +201,7 @@ public class RetransmissionService {
res = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/1001")
.headerMap(getHeaderMap(request), true)
.form(paramMap)
.setConnectionTimeout(10 * 1000)
.execute().body();
// 设置结束时间
endTime = System.currentTimeMillis();
......@@ -311,6 +312,7 @@ public class RetransmissionService {
res = HttpRequest.post(ocrApi + "/ofs/api/sync/v2/1001")
.headerMap(getHeaderMap(request), true)
.form(paramMap)
.setConnectionTimeout(10 * 1000)
.execute().body();
// 设置结束时间
endTime = System.currentTimeMillis();
......@@ -357,6 +359,7 @@ public class RetransmissionService {
HttpResponse httpResponse = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/pdf")
.headerMap(getHeaderMap(request), true)
.contentType("application/json;charset=UTF-8")
.setConnectionTimeout(10 * 1000)
.body(body.toJSONString(0)).execute();
Map<String, List<String>> headers = httpResponse.headers();
......@@ -417,7 +420,6 @@ public class RetransmissionService {
}
} catch (Exception e) {
log.error("在处理ID为 {} 的PDF下载过程中发生异常", id, e);
// returnError(response, 500, "OCR云平台接口异常");
}
}
......@@ -432,6 +434,7 @@ public class RetransmissionService {
HttpResponse httpResponse = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/ofd")
.headerMap(getHeaderMap(request), true)
.contentType("application/json;charset=UTF-8")
.setConnectionTimeout(10 * 1000)
.body(body.toJSONString(0)).execute();
Map<String, List<String>> headers = httpResponse.headers();
if (!headers.isEmpty()) {
......@@ -490,7 +493,6 @@ public class RetransmissionService {
}
} catch (Exception e) {
log.error("在处理ID为 {} 的PDF下载过程中发生异常", id, e);
// returnError(response, 500, "OCR云平台接口异常");
}
}
......@@ -530,6 +532,7 @@ public class RetransmissionService {
res = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/ft/1001")
.headerMap(getHeaderMap(request), true)
.form(paramMap)
.setConnectionTimeout(10 * 1000)
.execute().body();
// 设置结束时间
endTime = System.currentTimeMillis();
......@@ -600,6 +603,7 @@ public class RetransmissionService {
res = HttpRequest.post(ocrApi + "/ofs/api/sync/v2/1001")
.headerMap(getHeaderMap(request), true)
.form(paramMap)
.setConnectionTimeout(10 * 1000)
.execute().body();
// 设置结束时间
endTime = System.currentTimeMillis();
......@@ -658,6 +662,7 @@ public class RetransmissionService {
String res = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/kv/" + code)
.headerMap(getHeaderMap(request), true)
.form(paramMap)
.setConnectionTimeout(10 * 1000)
.execute().body();
// 设置结束时间
long endTime = System.currentTimeMillis();
......@@ -705,6 +710,7 @@ public class RetransmissionService {
String res = HttpRequest.post(ocrApi + "/ofs/api/async/minio/v1/" + code)
.headerMap(getHeaderMap(request), true)
.contentType("application/json;charset=UTF-8")
.setConnectionTimeout(10 * 1000)
.body(body.toJSONString(0)).execute().body();
// 设置结束时间
long endTime = System.currentTimeMillis();
......@@ -747,6 +753,7 @@ public class RetransmissionService {
String res = HttpRequest.post(ocrApi + "/ofs/api/sync/v1/6002")
.headerMap(getHeaderMap(request), true)
.form(paramMap)
.setConnectionTimeout(10 * 1000)
.execute().body();
// 设置结束时间
long endTime = System.currentTimeMillis();
......@@ -791,9 +798,8 @@ public class RetransmissionService {
addServerRequestCount(ocrServerAddress.getIp(), 1);
String ocrApi = "http://" + ocrServerAddress.getIp() + ":" + ocrServerAddress.getOcrPort();
HttpResponse httpResponse = HttpRequest.post(ocrApi + "/ofs/api/file/convert")
.header("Authorization", request.getHeader("Authorization"))
.header("X-Timestamp", request.getHeader("X-Timestamp"))
.header("X-Checksum", request.getHeader("X-Checksum"))
.headerMap(getHeaderMap(request), true)
.setConnectionTimeout(10 * 1000)
.contentType(ContentType.MULTIPART.getValue())
.form(paramMap).execute();
......@@ -848,28 +854,28 @@ public class RetransmissionService {
// 保存到ES
elasticSearchService.recordDataImport(Collections.singletonList(record));
// log.info("修改id:{}的真实客户端请求ip结果:{}", id, mapper.updateById(record));
AppAbilityRecordAll recordAll = recordAllMapper.selectById(id);
if (recordAll == null) {
recordAll = new AppAbilityRecordAll();
BeanUtils.copyProperties(record, recordAll, AppAbilityRecordAll.class);
recordAll.setCreatedTime(DateUtil.date());
recordAll.setUpdatedTime(DateUtil.date());
if (StrUtil.isEmpty(recordAll.getServerIp())) {
recordAll.setServerIp(serverIp);
}
recordAllMapper.insert(recordAll);
// log.info("添加id:{} 的数据到recordAll持久化保存结果:{}", recordAll.getId(), recordAllMapper.insert(recordAll));
} else {
AppAbilityRecordAll newRecordAll = new AppAbilityRecordAll();
BeanUtils.copyProperties(record, newRecordAll, AppAbilityRecordAll.class);
newRecordAll.setUpdatedTime(DateUtil.date());
if (StrUtil.isEmpty(newRecordAll.getServerIp())) {
newRecordAll.setServerIp(serverIp);
}
recordAllMapper.updateById(newRecordAll);
// log.info("修改recordAll中id:{} 的数据结果:{}", newRecordAll.getId(), recordAllMapper.updateById(newRecordAll));
}
// // log.info("修改id:{}的真实客户端请求ip结果:{}", id, mapper.updateById(record));
// AppAbilityRecordAll recordAll = recordAllMapper.selectById(id);
// if (recordAll == null) {
// recordAll = new AppAbilityRecordAll();
// BeanUtils.copyProperties(record, recordAll, AppAbilityRecordAll.class);
// recordAll.setCreatedTime(DateUtil.date());
// recordAll.setUpdatedTime(DateUtil.date());
// if (StrUtil.isEmpty(recordAll.getServerIp())) {
// recordAll.setServerIp(serverIp);
// }
// recordAllMapper.insert(recordAll);
// // log.info("添加id:{} 的数据到recordAll持久化保存结果:{}", recordAll.getId(), recordAllMapper.insert(recordAll));
// } else {
// AppAbilityRecordAll newRecordAll = new AppAbilityRecordAll();
// BeanUtils.copyProperties(record, newRecordAll, AppAbilityRecordAll.class);
// newRecordAll.setUpdatedTime(DateUtil.date());
// if (StrUtil.isEmpty(newRecordAll.getServerIp())) {
// newRecordAll.setServerIp(serverIp);
// }
// recordAllMapper.updateById(newRecordAll);
// // log.info("修改recordAll中id:{} 的数据结果:{}", newRecordAll.getId(), recordAllMapper.updateById(newRecordAll));
// }
}
......
......@@ -13,15 +13,26 @@ import co.elastic.clients.elasticsearch._types.aggregations.*;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.TotalHits;
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.extension.plugins.pagination.Page;
import com.gxmailu.ocrCloudPlatform.constant.RedisConstant;
import com.gxmailu.ocrCloudPlatform.dto.RecordDto;
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.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.CourtMapper;
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.RedisService;
import com.gxmailu.ocrCloudPlatform.vo.BrokenLineData;
......@@ -60,6 +71,12 @@ public class ESTest {
private ElasticSearchService elasticSearchService;
@Autowired
private AppAbilityRecordAllService appAbilityRecordAllService;
@Autowired
private ConfigAbilityService configAbilityService;
@Autowired
private ConfigApplicationService configApplicationService;
@Autowired
private CourtService courtService;
@Test
public void getCourtUseByYear() throws IOException {
......@@ -154,7 +171,7 @@ public class ESTest {
RecordDto recordDto = new RecordDto();
recordDto.setPage(1);
recordDto.setLimit(10);
// recordDto.setIpScopeList(Arrays.asList("147.4."));
recordDto.setIpScopeList(Arrays.asList("147.4.", "147.72."));
// recordDto.setApplicationId(5L);
// recordDto.setStartTime(DateUtil.parseDate("2023-05-11"));
// recordDto.setEndTime(DateUtil.parseDate("2023-05-11"));
......@@ -305,4 +322,92 @@ public class ESTest {
}
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