Commit cd4e8948 by 黄明步

.

parent 5c732a67
......@@ -21,6 +21,7 @@
<spring-cloud.version>Hoxton.SR11</spring-cloud.version>
<elasticsearch.version>8.9.1</elasticsearch.version>
<alibaba.druid.version>1.1.22</alibaba.druid.version>
<jackson.version>2.12.3</jackson.version>
</properties>
<dependencyManagement>
<dependencies>
......@@ -183,6 +184,12 @@
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>${elasticsearch.version}</version>
<exclusions>
<exclusion>
<artifactId>jakarta.json-api</artifactId>
<groupId>jakarta.json</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
......
package com.gxmailu.ocrCloudPlatform.constant;
/**
* @author: HuangHao
* @create: 2023-08-20 18:31
* @Description:
*/
public class RedisConstant {
/**
* redis key 用户法庭信息前缀
*/
public static final String COURT_INFO_USER_PREFIX = "court-role-user:";
/**
* redis key 法院列表
*/
public static final String COURT_LIST = "courtList";
/**
* redis key OCR服务器列表
*/
public static final String OCR_SERVER_LIST = "ocrServerList";
/**
* redis key 请求任务量
**/
public static final String SERVER_REQUEST_TASK = "server-request-task-";
/**
* redission 分布式锁名称
**/
public static final String LOCK_NAME = "server-task";
/**
* redis key 应用配置信息
**/
public static final String CONFIG_APPLICATION_ALL = "configApplication:all";
/**
* redis key 能力配置信息
**/
public static final String CONFIG_ABILITY_ALL = "configAbility:all";
}
......@@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.*;
......@@ -192,9 +193,14 @@ public class AppAbilityRecordAllController {
}
@PostMapping("/getListByPage")
public Object getListByPage(RecordDto recordDto) {
public Result getListByPage(@RequestBody RecordDto recordDto) {
Assert.notNull(recordDto, "参数不能为空");
return Result.success("",recordAllService.getList(recordDto));
try {
return Result.success("", recordAllService.getRecordList(recordDto));
} catch (IOException e) {
log.error("调用记录查询异常", e);
return Result.error("查询异常,请联系管理员");
}
}
@PostMapping("/getById")
public Object getById(Long id) {
......
......@@ -23,74 +23,6 @@ public class CourtController {
@Autowired
private CourtService courtService;
/*@RequestMapping("/getFile")
public ResponseEntity<Object> download(HttpServletRequest request,String filename) {
String path = "D:\\SDK\\nginx-1.19.9\\html\\"+filename;
String contentDisposition = ContentDisposition
.builder("attachment")
.filename(path)
.build().toString();
File file = new File(path);
if (file.exists()) {
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition)
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(new FileSystemResource(path));
} else {
JSONObject object = new JSONObject();
object.set("code",500);
object.set("mag","错误!");
return ResponseEntity.status(500)
.header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition + " Not Found")
.contentType(MediaType.APPLICATION_JSON)
.body(object.toJSONString(0));
}
}
@RequestMapping("one")
public void one(HttpServletRequest request, HttpServletResponse response){
System.out.println("接口11111111");
System.out.println("开始转发。。。。");
HttpResponse httpResponse = HttpRequest.post("http://192.168.13.38:9027/court/tow")
.header("appId",request.getHeader("appId"))
.execute();
System.out.println(httpResponse);
Map<String, List<String>> headers = httpResponse.headers();
System.out.println(headers.isEmpty());
for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
response.setHeader(entry.getKey(),entry.getValue().get(0));
}
try {
IoUtil.copy(httpResponse.bodyStream(),response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
@RequestMapping("tow")
public void tow(HttpServletRequest request, HttpServletResponse response){
System.out.println("接口2222222");
String appId = request.getHeader("appId");
System.out.println("appId:"+appId);
response.setStatus(200);
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
response.setCharacterEncoding("utf-8");
JSONObject object = new JSONObject();
object.set("code", 200);
object.set("message", "成功");
object.set("time", DateUtil.current());
try {
response.getWriter().write(object.toJSONString(0));
} catch (IOException ex) {
ex.printStackTrace();
}
}*/
/**
* 法院列表分页
*
......
......@@ -7,6 +7,7 @@ import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@Data
@ToString
......@@ -23,9 +24,9 @@ public class RecordDto implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date endTime;
private Long applicationId;
private String ipScope;
private List<String> ipScopeList;
private Integer page;
private Integer size;
private Integer limit;
private Integer network;
}
......@@ -6,6 +6,7 @@ import com.gxmailu.ocrCloudPlatform.entity.AppAbilityRecordAll;
import com.gxmailu.ocrCloudPlatform.entity.DeriveCallRecord;
import com.gxmailu.ocrCloudPlatform.vo.Result;
import java.io.IOException;
import java.util.List;
......@@ -36,4 +37,6 @@ public interface AppAbilityRecordAllService extends IService<AppAbilityRecordAll
Result getCorrelationData(String day1, String day2);
Result getBrokenLineData(String date);
Object getRecordList(RecordDto recordDto) throws IOException;
}
package com.gxmailu.ocrCloudPlatform.service;
import com.gxmailu.ocrCloudPlatform.entity.ConfigApplication;
import com.gxmailu.ocrCloudPlatform.vo.ConfigApplicationVO;
import com.gxmailu.ocrCloudPlatform.vo.Result;
import java.util.List;
public interface ConfigApplicationService {
Result queryConfigAppById(String id);
......@@ -13,4 +16,6 @@ public interface ConfigApplicationService {
Result insertConfigApp(ConfigApplicationVO configAppVo);
List<ConfigApplication> getConfigApplicationAll();
}
package com.gxmailu.ocrCloudPlatform.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gxmailu.ocrCloudPlatform.constant.RedisConstant;
import com.gxmailu.ocrCloudPlatform.dto.RecordDto;
import com.gxmailu.ocrCloudPlatform.entity.AppAbilityRecordAll;
import com.gxmailu.ocrCloudPlatform.entity.Court;
import com.gxmailu.ocrCloudPlatform.entity.DeriveCallRecord;
import com.gxmailu.ocrCloudPlatform.entity.ServerInfo;
import com.gxmailu.ocrCloudPlatform.entity.*;
import com.gxmailu.ocrCloudPlatform.mapper.*;
import com.gxmailu.ocrCloudPlatform.service.AppAbilityRecordAllService;
import com.gxmailu.ocrCloudPlatform.service.ConfigAbilityService;
import com.gxmailu.ocrCloudPlatform.service.ConfigApplicationService;
import com.gxmailu.ocrCloudPlatform.utils.SnowFlakeUtil;
import com.gxmailu.ocrCloudPlatform.vo.AppAbilityRecordVo;
import com.gxmailu.ocrCloudPlatform.vo.BrokenLineData;
import com.gxmailu.ocrCloudPlatform.vo.Result;
import lombok.extern.slf4j.Slf4j;
......@@ -26,11 +27,10 @@ import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* <p>
......@@ -65,6 +65,11 @@ public class AppAbilityRecordAllServiceImpl extends ServiceImpl<AppAbilityRecord
@Resource
private ElasticSearchService elasticSearchService;
@Resource
private ConfigAbilityService configAbilityService;
@Resource
private ConfigApplicationService configApplicationService;
@Override
......@@ -100,17 +105,17 @@ public class AppAbilityRecordAllServiceImpl extends ServiceImpl<AppAbilityRecord
serverIpList.add(serverInfo.getIp());
}
LambdaQueryWrapper<AppAbilityRecordAll> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.apply(recordDto.getStartTime() != null,
"date_format (created_time,'%Y-%m-%d') >= date_format ({0},'%Y-%m-%d')", recordDto.getStartTime())
.apply(recordDto.getEndTime() != null,
"date_format (created_time,'%Y-%m-%d') <= date_format ({0},'%Y-%m-%d')", recordDto.getEndTime())
.apply(recordDto.getApplicationId() != null, "application_id = {0}", recordDto.getApplicationId())
.apply(recordDto.getIpScope() != null, "ip like concat({0},'%')", recordDto.getIpScope())
.in(serverIpList.size() > 0, AppAbilityRecordAll::getServerIp, serverIpList)
.orderByDesc(AppAbilityRecordAll::getCreatedTime);
// queryWrapper.apply(recordDto.getStartTime() != null,
// "date_format (created_time,'%Y-%m-%d') >= date_format ({0},'%Y-%m-%d')", recordDto.getStartTime())
// .apply(recordDto.getEndTime() != null,
// "date_format (created_time,'%Y-%m-%d') <= date_format ({0},'%Y-%m-%d')", recordDto.getEndTime())
// .apply(recordDto.getApplicationId() != null, "application_id = {0}", recordDto.getApplicationId())
// .apply(recordDto.getIpScope() != null, "ip like concat({0},'%')", recordDto.getIpScope())
// .in(serverIpList.size() > 0, AppAbilityRecordAll::getServerIp, serverIpList)
// .orderByDesc(AppAbilityRecordAll::getCreatedTime);
if (recordDto.getPage() != null) {
recordDto.setSize(recordDto.getSize() == null ? 10 : recordDto.getSize());
Page<AppAbilityRecordAll> page = new Page<>(recordDto.getPage(), recordDto.getSize());
recordDto.setLimit(recordDto.getLimit() == null ? 10 : recordDto.getLimit());
Page<AppAbilityRecordAll> page = new Page<>(recordDto.getPage(), recordDto.getLimit());
return recordAllMapper.selectPage(page, queryWrapper);
} else {
return recordAllMapper.selectList(queryWrapper);
......@@ -118,18 +123,68 @@ public class AppAbilityRecordAllServiceImpl extends ServiceImpl<AppAbilityRecord
}
@Override
public Page<AppAbilityRecordVo> getRecordList(RecordDto recordDto) throws IOException {
// 获取应用用户配置
List<ConfigAbility> configAbilityList = configAbilityService.selectAll();
Map<String, ConfigAbility> abilityMap = configAbilityList.stream().collect(Collectors.toMap(ConfigAbility::getId, obj -> obj));
// 获取应用识别能力配置
List<ConfigApplication> configApplicationList = configApplicationService.getConfigApplicationAll();
Map<Long, ConfigApplication> applicationMap = configApplicationList.stream().collect(Collectors.toMap(ConfigApplication::getId, obj -> obj));
// 获取法院列表
List<Court> courtList;
Object data = redisService.getValue(RedisConstant.COURT_LIST);
if (ObjUtil.isNotNull(data)) {
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);
}
Page<AppAbilityRecord> recordByPage = elasticSearchService.getRecordList(recordDto);
ArrayList<AppAbilityRecordVo> recordVoList = new ArrayList<>();
recordByPage.getRecords().forEach(abilityRecord -> {
AppAbilityRecordVo recordVo = new AppAbilityRecordVo();
BeanUtil.copyProperties(abilityRecord, recordVo);
recordVo.setIp(abilityRecord.getIp().split(",")[0]);
Optional<Court> first = courtList.stream().filter(court -> {
String ipScope = court.getIpScope();
String[] ipScopes = ipScope.split(";");
for (String scope : ipScopes) {
if (recordVo.getIp().startsWith(scope)) {
return true;
}
}
return false;
}).findFirst();
recordVo.setCourtName(first.isPresent() ? first.get().getName() : "未知");
recordVo.setBusinessVendors(applicationMap.get(abilityRecord.getApplicationId()).getDescription());
recordVo.setAppAbilityName(abilityMap.get(abilityRecord.getAbilityId().toString()).getName());
recordVo.setCallCount("1");
recordVoList.add(recordVo);
});
Page<AppAbilityRecordVo> page = new Page<>();
page.setTotal(recordByPage.getTotal());
page.setSize(recordByPage.getSize());
page.setCurrent(recordByPage.getCurrent());
page.setRecords(recordVoList);
return page;
}
@Override
public Object getCourtUseSum() {
List<Court> courtList;
Object data = redisService.getValue("courtList");
Object data = redisService.getValue(RedisConstant.COURT_LIST);
if (data != null) {
JSONArray array = JSONUtil.parseArray(data);
courtList = new ArrayList<>();
for (Object o : array) {
courtList.add(JSONUtil.parseObj(o).toBean(Court.class));
}
// JSONArray array = JSONUtil.parseArray(data);
// courtList = new ArrayList<>();
// for (Object o : array) {
// courtList.add(JSONUtil.parseObj(o).toBean(Court.class));
// }
courtList = JSONUtil.toList(data.toString(), Court.class);
} else {
courtList = courtMapper.selectList(new LambdaQueryWrapper<Court>().isNotNull(Court::getIpScope));
redisService.set("courtList", courtList, 5L, TimeUnit.MINUTES);
redisService.set(RedisConstant.COURT_LIST, courtList, 1L, TimeUnit.DAYS);
}
// JSONArray array = new JSONArray();
// try {
......
package com.gxmailu.ocrCloudPlatform.service.impl;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.gxmailu.ocrCloudPlatform.constant.RedisConstant;
import com.gxmailu.ocrCloudPlatform.entity.ConfigAbility;
import com.gxmailu.ocrCloudPlatform.mapper.ConfigAbilityMapper;
import com.gxmailu.ocrCloudPlatform.service.ConfigAbilityService;
......@@ -8,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.concurrent.TimeUnit;
@Service
public class ConfigAbilityServiceImpl implements ConfigAbilityService {
......@@ -15,6 +19,9 @@ public class ConfigAbilityServiceImpl implements ConfigAbilityService {
@Autowired
private ConfigAbilityMapper configAbilityMapper;
@Autowired
private RedisService redisService;
@Override
public List<ConfigAbility> selectConfigAbilityByAppId(String appId) {
return this.configAbilityMapper.selectConfigAbilityByAppId(appId);
......@@ -22,6 +29,13 @@ public class ConfigAbilityServiceImpl implements ConfigAbilityService {
@Override
public List<ConfigAbility> selectAll() {
return configAbilityMapper.selectList(Wrappers.lambdaQuery(ConfigAbility.class).isNotNull(ConfigAbility::getParentId));
Object obj = redisService.getValue(RedisConstant.CONFIG_ABILITY_ALL);
if (ObjUtil.isNotNull(obj)) {
return JSONUtil.toList(obj.toString(), ConfigAbility.class);
} else {
List<ConfigAbility> list = configAbilityMapper.selectList(Wrappers.lambdaQuery(ConfigAbility.class));
redisService.set(RedisConstant.CONFIG_ABILITY_ALL, list, 1, TimeUnit.DAYS);
return list;
}
}
}
package com.gxmailu.ocrCloudPlatform.service.impl;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gxmailu.ocrCloudPlatform.constant.RedisConstant;
import com.gxmailu.ocrCloudPlatform.entity.ConfigAppAbility;
import com.gxmailu.ocrCloudPlatform.entity.ConfigApplication;
import com.gxmailu.ocrCloudPlatform.mapper.ConfigAppAbilityMapper;
......@@ -21,6 +24,7 @@ import org.thymeleaf.util.ListUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Service
......@@ -33,6 +37,9 @@ public class ConfigApplicationServiceImpl implements ConfigApplicationService {
@Autowired
private ConfigAppAbilityMapper configAppAbilityMapper;
@Autowired
RedisService redisService;
@Override
public Result queryConfigAppById(String id) {
try {
......@@ -68,6 +75,8 @@ public class ConfigApplicationServiceImpl implements ConfigApplicationService {
try {
int result = this.configApplicationMapper.updateById(info);
if (result > 0) {
redisService.remove(RedisConstant.CONFIG_APPLICATION_ALL);
//直接删掉旧的重新新增
//先删除
this.configAppAbilityMapper.delete(new QueryWrapper<ConfigAppAbility>().eq("application_id", configAppVo.getId()));
......@@ -148,6 +157,7 @@ public class ConfigApplicationServiceImpl implements ConfigApplicationService {
try {
result = this.configApplicationMapper.insert(info);
if (result >= 1) {
redisService.remove(RedisConstant.CONFIG_APPLICATION_ALL);
//保存应用功能关联
this.batchSaveConfigAppAbility(configAppVo, info.getId());
}
......@@ -158,4 +168,21 @@ public class ConfigApplicationServiceImpl implements ConfigApplicationService {
return result >= 1 ? Result.success("新增成功") : Result.error("新增失败");
}
@Override
public List<ConfigApplication> getConfigApplicationAll() {
try {
Object value = redisService.getValue(RedisConstant.CONFIG_APPLICATION_ALL);
if (ObjUtil.isNotNull(value)) {
return JSONUtil.toList(value.toString(), ConfigApplication.class);
} else {
List<ConfigApplication> list = this.configApplicationMapper.selectList(null);
redisService.set(RedisConstant.CONFIG_APPLICATION_ALL, list, 1, TimeUnit.DAYS);
return list;
}
} catch (Exception e) {
log.error("查询应用信息发生异常!", e);
return new ArrayList<>();
}
}
}
......@@ -3,6 +3,7 @@ package com.gxmailu.ocrCloudPlatform.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gxmailu.ocrCloudPlatform.constant.RedisConstant;
import com.gxmailu.ocrCloudPlatform.entity.Court;
import com.gxmailu.ocrCloudPlatform.mapper.CourtMapper;
import com.gxmailu.ocrCloudPlatform.service.CourtService;
......@@ -22,7 +23,8 @@ public class CourtServiceImpl implements CourtService {
@Autowired
private CourtMapper courtMapper;
@Autowired
private RedisService redisService;
@Override
public Result courtPage(CourtVO courtVO) {
//设置分页信息
......@@ -74,6 +76,8 @@ public class CourtServiceImpl implements CourtService {
try {
int result = this.courtMapper.updateById(court);
if (result >= 1) {
redisService.removeByPrefix(RedisConstant.COURT_INFO_USER_PREFIX);
redisService.removeByPrefix(RedisConstant.COURT_LIST);
return Result.success("修改成功");
}
} catch (Exception e) {
......@@ -91,6 +95,7 @@ public class CourtServiceImpl implements CourtService {
try {
int result = this.courtMapper.insert(court);
if (result >= 1) {
redisService.removeByPrefix(RedisConstant.COURT_INFO_USER_PREFIX);
return Result.success("新增成功");
}
} catch (Exception e) {
......
......@@ -5,10 +5,13 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.FieldValue;
import co.elastic.clients.elasticsearch._types.SortOrder;
import co.elastic.clients.elasticsearch._types.aggregations.*;
import co.elastic.clients.elasticsearch.core.*;
import co.elastic.clients.elasticsearch.core.bulk.BulkResponseItem;
......@@ -16,10 +19,15 @@ import co.elastic.clients.elasticsearch.core.search.TotalHits;
import co.elastic.clients.elasticsearch.indices.DeleteIndexResponse;
import co.elastic.clients.json.JsonData;
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.mapper.*;
import com.gxmailu.ocrCloudPlatform.entity.ServerInfo;
import com.gxmailu.ocrCloudPlatform.mapper.AppAbilityRecordAllMapper;
import com.gxmailu.ocrCloudPlatform.mapper.ServerInfoMapper;
import com.gxmailu.ocrCloudPlatform.vo.BrokenLineData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -27,6 +35,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;
......@@ -50,13 +59,7 @@ public class ElasticSearchService {
@Resource
private AppAbilityRecordAllMapper recordAllMapper;
@Resource
private AppAbilityRecord4Mapper record4Mapper;
@Resource
private AppAbilityRecord3Mapper record3Mapper;
@Resource
private AppAbilityRecord5Mapper record5Mapper;
@Resource
private AppAbilityRecord7Mapper record7Mapper;
private ServerInfoMapper serverInfoMapper;
static {
SPECIAL_CHARACTERS_MAP.put('[', "\\[");
......@@ -292,4 +295,122 @@ public class ElasticSearchService {
lastIndexTime = DateUtil.formatDateTime(new Date());
log.info("app_ability_record索引最后更新时间:{}", lastIndexTime);
}
public Page<AppAbilityRecord> getRecordList(RecordDto recordDto) throws IOException {
Integer network = recordDto.getNetwork(); // 内网或内网,-1:全部,0:内网,1:外网
// 查询内外网机器的ip
List<ServerInfo> list = serverInfoMapper.selectList(Wrappers.lambdaQuery(ServerInfo.class)
.eq(network != null && network != -1, ServerInfo::getNetwork, network));
List<String> serverIpList = list.stream().map(ServerInfo::getIp).collect(Collectors.toList());
// 限制查询数不超过10000,若超过随机查询一页
recordDto.setLimit(ObjUtil.isNull(recordDto.getLimit()) ? 10 : recordDto.getLimit());
int offset = (recordDto.getPage() - 1) * recordDto.getLimit() + recordDto.getLimit() > 10000 ? RandomUtil.randomInt(8000, 9000) : (recordDto.getPage() - 1) * recordDto.getLimit();
int size = recordDto.getLimit();
SearchResponse<AppAbilityRecord> searchResponse = client.search(srBuilder -> srBuilder
.index(APP_ABILITY_RECORD_INDEX)
.query(queryBuilder -> queryBuilder.bool(boolQuery -> {
// 时间范围查询
if (ObjUtil.isNotNull(recordDto.getStartTime()) && ObjUtil.isNotNull(recordDto.getEndTime())) {
String startTime = DateUtil.beginOfDay(recordDto.getStartTime()).toString("yyyy-MM-dd HH:mm:ss");
String endTime = DateUtil.endOfDay(recordDto.getEndTime()).toString("yyyy-MM-dd HH:mm:ss");
boolQuery.must(q -> q.range(rangeQueryBuilder -> rangeQueryBuilder
.field("callTime")
.gte(JsonData.of(startTime))
.lt(JsonData.of(endTime))));
}
if (CollUtil.isNotEmpty(serverIpList)) {
List<FieldValue> collect = serverIpList.stream().map(FieldValue::of).collect(Collectors.toList());
boolQuery.filter(mustQuery -> mustQuery.terms(tq -> tq.field("serverIp").terms(tqf -> tqf.value(collect))));
}
// // 多个法院ip前缀过滤
// 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.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()) {
if (StrUtil.isNotBlank(ipScope)) {
bq.should(q -> q.prefix(pq -> pq.field("ip.keyword").value(ipScope)));
}
}
}
return bq;
}));
if (ObjUtil.isNotNull(recordDto.getApplicationId())) {
boolQuery.must(mustQuery -> mustQuery.match(mq -> mq.field("applicationId").query(recordDto.getApplicationId().toString())));
}
return boolQuery;
}))
.from(offset)
.size(size)
.sort(s -> s.field(fs -> fs.field("callTime.keyword").order(SortOrder.Desc)))
.trackTotalHits(tb -> tb.enabled(true)), AppAbilityRecord.class);
return handlePageResultWithHighlight(searchResponse, AppAbilityRecord.class, recordDto);
}
/**
* 构建分页对象,包括高亮处理
*
* @param response es响应结果
* @param targetType 目标对象类型
*/
private <T> Page<T> handlePageResultWithHighlight(SearchResponse<?> response, Class<T> targetType, RecordDto dto) {
ObjectMapper objectMapper = new ObjectMapper();
TotalHits totalHits = response.hits().total();
long total = ObjUtil.isNull(totalHits) ? 0 : totalHits.value();
// 这是索引库中的总数
// total = total != 10000 ? total : client.count(req -> req.index(indexName)).count();
List<T> list = response.hits().hits().stream().map(hit -> {
// 对象转换
T obj = objectMapper.convertValue(hit.source(), targetType);
// 处理高亮
Map<String, List<String>> highlightFields = hit.highlight();
for (Map.Entry<String, List<String>> entry : highlightFields.entrySet()) {
String fieldName = entry.getKey();
List<String> highlightValues = entry.getValue();
if (highlightValues != null && !highlightValues.isEmpty()) {
// 使用反射或其他适当的方式将高亮文本赋值到对象的相应字段上
try {
Field field = targetType.getDeclaredField(fieldName);
field.setAccessible(true);
// 如果有多个高亮值,可以将它们连接成一个字符串,然后赋值
String highlightedText = String.join("", highlightValues);
// 重新赋值
field.set(obj, highlightedText);
} catch (NoSuchFieldException | IllegalAccessException e) {
log.error("构建分页对象出错:" + e);
}
}
}
return obj;
}).collect(Collectors.toList());
Page<T> page = new Page<>();
page.setTotal(total);
page.setRecords(list);
page.setSize(dto.getLimit());
page.setCurrent(dto.getPage());
return page;
// return PageVo.ofReqVo(vo, list, (int) total);
}
}
package com.gxmailu.ocrCloudPlatform.service.impl;
import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
......@@ -172,6 +173,17 @@ public class RedisService {
}
}
/**
* 根据前缀删除Redis中的键
* @param keyPrefix 键的前缀
*/
public void removeByPrefix(String keyPrefix) {
Set<Object> keys = redisTemplate.keys(keyPrefix + "*");
if (CollUtil.isNotEmpty(keys)) {
redisTemplate.delete(keys);
}
}
public boolean exists(String key) {
return Boolean.TRUE.equals(redisTemplate.hasKey(key));
}
......
......@@ -16,6 +16,7 @@ import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.gxmailu.ocrCloudPlatform.config.DistributedRedisLock;
import com.gxmailu.ocrCloudPlatform.constant.RedisConstant;
import com.gxmailu.ocrCloudPlatform.entity.AppAbilityRecord;
import com.gxmailu.ocrCloudPlatform.entity.AppAbilityRecordAll;
import com.gxmailu.ocrCloudPlatform.entity.ServerInfo;
......@@ -99,11 +100,7 @@ public class RetransmissionService {
private final Random random = new Random();
private final AtomicInteger counter = new AtomicInteger(0);
/**
* redis key 请求任务量
**/
private static final String SERVER_REQUEST_TASK = "server-request-task-";
private static final String LOCK_NAME = "server-task";
/**
* 重试次数
*/
......@@ -239,11 +236,22 @@ public class RetransmissionService {
}
public Map<String, String> getHeaderMap(HttpServletRequest request) {
Map<String, String> headerMap = new HashMap<>();
headerMap.put("Authorization", request.getHeader("Authorization"));
headerMap.put("X-Timestamp", request.getHeader("X-Timestamp"));
headerMap.put("X-Checksum", request.getHeader("X-Checksum"));
return headerMap;
// Map<String, String> headerMap = new HashMap<>();
// headerMap.put("Authorization", request.getHeader("Authorization"));
// headerMap.put("X-Timestamp", request.getHeader("X-Timestamp"));
// headerMap.put("X-Checksum", request.getHeader("X-Checksum"));
// headerMap.put("Accept", request.getHeader("Accept"));
// headerMap.put("User-Agent", request.getHeader("User-Agent"));
// return headerMap;
Map<String, String> map = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String key = headerNames.nextElement();
String value = request.getHeader(key);
map.put(key, value);
}
return map;
}
......@@ -888,17 +896,17 @@ public class RetransmissionService {
@Async("dataPersistThreadPoolTaskExecutor")
public void addServerRequestCount(String ip, long delta) {
// 获取公平锁
distributedRedisLock.getFairLock(LOCK_NAME);
distributedRedisLock.getFairLock(RedisConstant.LOCK_NAME);
try {
Long incr = redisService.incr(SERVER_REQUEST_TASK + ip, delta);
Long incr = redisService.incr(RedisConstant.SERVER_REQUEST_TASK + ip, delta);
if (incr < 0) {
redisService.set(SERVER_REQUEST_TASK + ip, 0L, 30, TimeUnit.SECONDS);
redisService.set(RedisConstant.SERVER_REQUEST_TASK + ip, 0L, 30, TimeUnit.SECONDS);
}
} catch (Exception e) {
log.error("缓存服务器请求量任务失败", e);
} finally {
// 释放锁
distributedRedisLock.unlock(LOCK_NAME);
distributedRedisLock.unlock(RedisConstant.LOCK_NAME);
}
}
......@@ -914,7 +922,7 @@ public class RetransmissionService {
if (ocrServerList == null) {
ocrServerList = serverInfoMapper.selectList(Wrappers.lambdaQuery(ServerInfo.class)
.eq(ServerInfo::getAccessService, true));
redisService.set("ocrServerList", ocrServerList);
redisService.set(RedisConstant.OCR_SERVER_LIST, ocrServerList);
}
List<ServerInfo> notActiveServerList = new ArrayList<>();
for (ServerInfo serverInfo : ocrServerList) {
......@@ -948,7 +956,7 @@ public class RetransmissionService {
ocrServerList = serverInfoService.getCacheList();
if (CollUtil.isEmpty(ocrServerList)) {
ocrServerList = serverInfoMapper.selectList(Wrappers.lambdaQuery(ServerInfo.class).eq(ServerInfo::getAccessService, true));
redisService.set("ocrServerList", ocrServerList, 60, TimeUnit.MINUTES);
redisService.set(RedisConstant.OCR_SERVER_LIST, ocrServerList, 60, TimeUnit.MINUTES);
}
}
}
......@@ -956,7 +964,7 @@ public class RetransmissionService {
// 获取空闲的服务器列表
List<ServerInfo> notActiveServerList = ocrServerList.stream()
.filter(serverInfo -> {
Object obj = redisService.get(SERVER_REQUEST_TASK + serverInfo.getIp());
Object obj = redisService.get(RedisConstant.SERVER_REQUEST_TASK + serverInfo.getIp());
if (ObjUtil.isNotNull(obj) && obj instanceof Number) {
return ((Number) obj).longValue() <= 0;
}
......@@ -971,7 +979,7 @@ public class RetransmissionService {
} else {
// 如果没有空闲的服务器,则从redis中根据服务器请求量选择一个请求量最少的服务器
serverInfo = ocrServerList.stream().min(Comparator.comparingLong(server -> {
Number value = (Number) redisService.getValue(SERVER_REQUEST_TASK + server.getIp());
Number value = (Number) redisService.getValue(RedisConstant.SERVER_REQUEST_TASK + server.getIp());
return (ObjUtil.isNotNull(value) ? value.longValue() : 0L);
})).orElse(null);
}
......
......@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.AES;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gxmailu.ocrCloudPlatform.constant.RedisConstant;
import com.gxmailu.ocrCloudPlatform.entity.ServerInfo;
import com.gxmailu.ocrCloudPlatform.mapper.ServerInfoMapper;
import com.gxmailu.ocrCloudPlatform.service.ServerInfoService;
......@@ -134,7 +135,7 @@ public class ServerInfoServiceImpl implements ServerInfoService {
if (CollUtil.isEmpty(serverInfos)) {
return Result.error("OCR云平台未配置服务器信息");
}
redisService.set("ocrServerList", serverInfos);
redisService.set(RedisConstant.OCR_SERVER_LIST, serverInfos);
return Result.success("刷新缓存成功");
} catch (Exception e) {
log.error("刷新缓存失败", e);
......@@ -145,11 +146,11 @@ public class ServerInfoServiceImpl implements ServerInfoService {
@Override
public List<ServerInfo> getCacheList() {
// return serverInfoMapper.selectList(new ServerInfo(true));
Object object = redisService.getValue("ocrServerList");
Object object = redisService.getValue(RedisConstant.OCR_SERVER_LIST);
if (object == null) {
List<ServerInfo> serverInfos = serverInfoMapper.selectList(Wrappers.lambdaQuery(ServerInfo.class)
.eq(ServerInfo::getAccessService,true));
redisService.set("ocrServerList", serverInfos);
redisService.set(RedisConstant.OCR_SERVER_LIST, serverInfos);
return serverInfos;
} else {
return JSONArray.parseArray(object.toString(), ServerInfo.class);
......@@ -282,7 +283,7 @@ public class ServerInfoServiceImpl implements ServerInfoService {
//修改成功后,查询整个列表并设置进redis
List<ServerInfo> serverList = serverInfoMapper.selectList(Wrappers.lambdaQuery(ServerInfo.class)
.eq(ServerInfo::getAccessService, true));
redisService.set("ocrServerList", serverList);
redisService.set(RedisConstant.OCR_SERVER_LIST, serverList);
}
});
newThread.start();
......
package com.gxmailu.ocrCloudPlatform.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
/**
* @author Hmb
* @since 2024/1/16 9:46
*/
@Data
public class AppAbilityRecordVo {
private String id;
/**
* 法院名称
*/
private String courtName;
/**
* 业务厂家
*/
private String businessVendors;
private String appAbilityName;
private String ip;
/**
* 文件页数
*/
private Integer fileCount;
/**
* 调用次数
*/
private String callCount;
/**
* 调用时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date callTime;
/**
* 调用服务器ip
*/
private String serverIp;
}
......@@ -70,4 +70,8 @@ elasticsearch:
port: 9211
http: http
username: elastic
password: RQuT4eQIdIZ57waX9f87
\ No newline at end of file
password: RQuT4eQIdIZ57waX9f87
#
#eureka:
# client:
# enabled: false
\ No newline at end of file
......@@ -37,8 +37,8 @@ eureka:
instance:
prefer-ip-address: true
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
lease-expiration-duration-in-seconds: 30
lease-renewal-interval-in-seconds: 10
lease-expiration-duration-in-seconds: 6
lease-renewal-interval-in-seconds: 2
logging:
level:
......
......@@ -14,6 +14,10 @@ import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.TotalHits;
import co.elastic.clients.json.JsonData;
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.Court;
import com.gxmailu.ocrCloudPlatform.mapper.AppAbilityRecordAllMapper;
import com.gxmailu.ocrCloudPlatform.mapper.CourtMapper;
......@@ -21,7 +25,6 @@ import com.gxmailu.ocrCloudPlatform.service.AppAbilityRecordAllService;
import com.gxmailu.ocrCloudPlatform.service.impl.ElasticSearchService;
import com.gxmailu.ocrCloudPlatform.service.impl.RedisService;
import com.gxmailu.ocrCloudPlatform.vo.BrokenLineData;
import com.gxmailu.ocrCloudPlatform.vo.Result;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
......@@ -93,7 +96,7 @@ public class ESTest {
@Test
public void getCourtUseSum() throws IOException {
List<Court> courtList;
Object data = redisService.getValue("courtList");
Object data = redisService.getValue(RedisConstant.COURT_LIST);
if (data != null) {
JSONArray array = JSONUtil.parseArray(data);
courtList = new ArrayList<>();
......@@ -102,7 +105,7 @@ public class ESTest {
}
} else {
courtList = courtMapper.selectList(new LambdaQueryWrapper<Court>().isNotNull(Court::getIpScope));
redisService.set("courtList", courtList, 5L, TimeUnit.MINUTES);
redisService.set(RedisConstant.COURT_LIST, courtList, 1L, TimeUnit.DAYS);
}
JSONArray array = new JSONArray();
SearchResponse<Void> searchResponse = client.search(srBuilder -> srBuilder.index(APP_ABILITY_RECORD_INDEX).query(queryBuilder -> queryBuilder.bool(boolQuery -> {
......@@ -147,10 +150,20 @@ public class ESTest {
}
@Test
public void afds() {
Result brokenLineData = appAbilityRecordAllService.getCorrelationData("2023-12-10", "2023-12-09");
Result brokenLineData1 = appAbilityRecordAllService.getBrokenLineData("2023-12-10");
System.out.println(brokenLineData);
public void afds() throws IOException {
RecordDto recordDto = new RecordDto();
recordDto.setPage(1);
recordDto.setLimit(10);
// recordDto.setIpScopeList(Arrays.asList("147.4."));
// recordDto.setApplicationId(5L);
// recordDto.setStartTime(DateUtil.parseDate("2023-05-11"));
// recordDto.setEndTime(DateUtil.parseDate("2023-05-11"));
Page<AppAbilityRecord> recordList = elasticSearchService.getRecordList(recordDto);
recordList.getRecords().forEach(System.out::println);
// Object recordList1 = appAbilityRecordAllService.getRecordList(recordDto);
// System.out.println(recordList1);
}
......
package com.gxmailu.ocrCloudPlatform;
import com.gxmailu.ocrCloudPlatform.constant.RedisConstant;
import com.gxmailu.ocrCloudPlatform.entity.ConfigAbility;
import com.gxmailu.ocrCloudPlatform.entity.ServerInfo;
import com.gxmailu.ocrCloudPlatform.mapper.ServerInfoMapper;
......@@ -71,7 +72,7 @@ class RetransmissionServiceTest {
ocrServerList.add(serverInfo8);
ocrServerList.add(serverInfo9);
ocrServerList.add(serverInfo10);
redisService.set("ocrServerList", ocrServerList, 30, TimeUnit.MINUTES);
redisService.set(RedisConstant.OCR_SERVER_LIST, ocrServerList, 30, TimeUnit.MINUTES);
}
@Test
......
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