xiexiang 1 年間 前
コミット
79cef0c9c4

+ 23 - 0
PCS/src/main/java/cn/cslg/permission/common/model/dto/QueryRetrieveRecordDTO.java

@@ -0,0 +1,23 @@
+package cn.cslg.permission.common.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.List;
+
+/**
+ * 查询检索记录
+ * @Author xiexiang
+ * @Date 2023/9/20
+ */
+@Data
+public class QueryRetrieveRecordDTO {
+    private List<Integer> tenantIds;
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private String startTime;
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private String endTime;
+}

+ 4 - 0
PCS/src/main/java/cn/cslg/permission/common/model/vo/LoginRecordExportVO.java

@@ -10,6 +10,10 @@ import java.util.Date;
  */
 @Data
 public class LoginRecordExportVO {
+    /**
+     * 租户id
+     */
+    private Integer tenantId;
 
     /**
      * 租户名称

+ 15 - 0
PCS/src/main/java/cn/cslg/permission/common/model/vo/ProjectUsedByTenantVO.java

@@ -32,4 +32,19 @@ public class ProjectUsedByTenantVO {
      * 专利数量
      */
     private Integer patentNum;
+
+    /**
+     * 创建人id
+     */
+    private Integer createId;
+
+    /**
+     * 创建人
+     */
+    private String createName;
+
+    /**
+     * 创建时间
+     */
+    private String createTime;
 }

+ 15 - 0
PCS/src/main/java/cn/cslg/permission/common/model/vo/ReportUsedByTenantVO.java

@@ -23,4 +23,19 @@ public class ReportUsedByTenantVO {
      * 报告名称
      */
     private String reportName;
+
+    /**
+     * 创建人id
+     */
+    private Integer createId;
+
+    /**
+     * 创建人
+     */
+    private String createName;
+
+    /**
+     * 创建时间
+     */
+    private String createTime;
 }

+ 50 - 0
PCS/src/main/java/cn/cslg/permission/common/model/vo/RetrieveRecordExportVO.java

@@ -0,0 +1,50 @@
+package cn.cslg.permission.common.model.vo;
+
+import lombok.Data;
+
+/**
+ * @Author xiexiang
+ * @Date 2023/9/18
+ */
+@Data
+public class RetrieveRecordExportVO {
+    /**
+     * 租户id
+     */
+    private Integer tenantId;
+
+    /**
+     * 租户名
+     */
+    private String tenantName;
+
+    /**
+     * 检索人
+     */
+    private Integer createId;
+
+    /**
+     * 检索人名称
+     */
+    private String createName;
+
+    /**
+     * 检索时间
+     */
+    private String retrieveTime;
+
+    /**
+     * 数据库类型
+     */
+    private String dbType;
+
+    /**
+     * 检索式
+     */
+    private String conditions;
+
+    /**
+     * 检索次数
+     */
+    private Integer totalNum;
+}

+ 45 - 14
PCS/src/main/java/cn/cslg/permission/controller/Export2ExcelController.java

@@ -2,10 +2,12 @@ package cn.cslg.permission.controller;
 
 import cn.cslg.permission.common.core.base.Constants;
 import cn.cslg.permission.common.model.dto.QueryLoginRecordDTO;
+import cn.cslg.permission.common.model.dto.QueryRetrieveRecordDTO;
 import cn.cslg.permission.common.model.vo.PersonnelNameVO;
 import cn.cslg.permission.common.model.vo.ReportTenantVO;
 import cn.cslg.permission.common.utils.Response;
 import cn.cslg.permission.service.Export2ExcelService;
+import cn.cslg.permission.service.ParseOutDataForExcelService;
 import cn.hutool.core.util.IdUtil;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -20,6 +22,9 @@ import org.springframework.web.bind.annotation.*;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.Date;
 import java.util.List;
 
@@ -35,16 +40,32 @@ import java.util.List;
 @RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class Export2ExcelController {
     private final Export2ExcelService export2ExcelService;
+    private final ParseOutDataForExcelService parseOutDataForExcelService;
 
+    @PostMapping("/exportRetrieveRecord")
+    @Operation(summary = "导出检索记录")
+    public ResponseEntity<InputStreamResource> exportRetrieveRecord(@RequestBody QueryRetrieveRecordDTO queryRetrieveRecordDTO) throws IOException {
+        byte[] fileData = export2ExcelService.exportRetrieveRecord(queryRetrieveRecordDTO);
+        //保存生成excel的地址
+        String fileName = "检索记录报表.xlsx";
+        //文件原始名中的中文字符可能会乱码,对文件名进行URL编码
+        String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
+        return ResponseEntity.ok().contentLength(fileData.length)
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFileName + "\"")
+                .contentType(MediaType.parseMediaType("application/octet-stream"))
+                .body(new InputStreamResource(new ByteArrayInputStream(fileData)));
+    }
 
     @PostMapping("/exportLoginRecord")
     @Operation(summary = "导出登录日志")
     public ResponseEntity<InputStreamResource> exportLoginRecord(@RequestBody QueryLoginRecordDTO queryLoginRecordDTO) throws IOException {
         byte[] fileData = export2ExcelService.exportLoginRecord(queryLoginRecordDTO);
         //保存生成excel的地址
-        String fileName = IdUtil.simpleUUID() + ".xls";
+        String fileName = "登录日志报表.xlsx";
+        //文件原始名中的中文字符可能会乱码,对文件名进行URL编码
+        String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
         return ResponseEntity.ok().contentLength(fileData.length)
-                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"")
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFileName + "\"")
                 .contentType(MediaType.parseMediaType("application/octet-stream"))
                 .body(new InputStreamResource(new ByteArrayInputStream(fileData)));
     }
@@ -54,9 +75,11 @@ public class Export2ExcelController {
     public ResponseEntity<InputStreamResource> exportTotal(@RequestBody List<Integer> tenantIds) throws IOException {
         byte[] fileData = export2ExcelService.exportTotal(tenantIds);
         //保存生成excel的地址
-        String fileName = IdUtil.simpleUUID() + ".xls";
+        String fileName = "汇总报表.xlsx";
+        //文件原始名中的中文字符可能会乱码,对文件名进行URL编码
+        String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
         return ResponseEntity.ok().contentLength(fileData.length)
-                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"")
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFileName + "\"")
                 .contentType(MediaType.parseMediaType("application/octet-stream"))
                 .body(new InputStreamResource(new ByteArrayInputStream(fileData)));
     }
@@ -66,9 +89,11 @@ public class Export2ExcelController {
     public ResponseEntity<InputStreamResource> exportProject(@RequestBody List<Integer> tenantIds) throws IOException {
         byte[] fileData = export2ExcelService.exportProjectNameToExcel(tenantIds);
         //保存生成excel的地址
-        String fileName = IdUtil.simpleUUID() + ".xls";
+        String fileName = "租户专题库使用报表.xlsx";
+        //文件原始名中的中文字符可能会乱码,对文件名进行URL编码
+        String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
         return ResponseEntity.ok().contentLength(fileData.length)
-                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"")
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFileName + "\"")
                 .contentType(MediaType.parseMediaType("application/octet-stream"))
                 .body(new InputStreamResource(new ByteArrayInputStream(fileData)));
     }
@@ -78,9 +103,11 @@ public class Export2ExcelController {
     public ResponseEntity<InputStreamResource> exportPersonName(@RequestBody List<Integer> tenantIds) throws IOException {
         byte[] fileData = export2ExcelService.exportPersonnelNameToExcel(tenantIds);
         //保存生成excel的地址
-        String fileName = IdUtil.simpleUUID() + ".xls";
+        String fileName = "租户人员报表.xlsx";
+        //文件原始名中的中文字符可能会乱码,对文件名进行URL编码
+        String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
         return ResponseEntity.ok().contentLength(fileData.length)
-                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"")
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFileName + "\"")
                 .contentType(MediaType.parseMediaType("application/octet-stream"))
                 .body(new InputStreamResource(new ByteArrayInputStream(fileData)));
     }
@@ -88,7 +115,7 @@ public class Export2ExcelController {
     @PostMapping("/getTenantPerson")
     @Operation(summary = "查出所有租户,并且查出租户下的人员")
     public List<ReportTenantVO> getTenantPerson(@RequestBody List<Integer> tenantIds){
-        return export2ExcelService.getTenantPerson(tenantIds);
+        return parseOutDataForExcelService.getTenantPerson(tenantIds);
     }
 
     @PostMapping("/exportReport")
@@ -96,9 +123,11 @@ public class Export2ExcelController {
     public ResponseEntity<InputStreamResource> exportReport(@RequestBody List<Integer> tenantIds) throws IOException {
         byte[] fileData = export2ExcelService.exportReportTenant(tenantIds);
         //保存生成excel的地址
-        String fileName = IdUtil.simpleUUID() + ".xls";
+        String fileName = "租户报告使用报表.xlsx";
+        //文件原始名中的中文字符可能会乱码,对文件名进行URL编码
+        String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
         return ResponseEntity.ok().contentLength(fileData.length)
-                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"")
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFileName + "\"")
                 .contentType(MediaType.parseMediaType("application/octet-stream"))
                 .body(new InputStreamResource(new ByteArrayInputStream(fileData)));
     }
@@ -108,9 +137,11 @@ public class Export2ExcelController {
     public ResponseEntity<InputStreamResource> exportProjectShared(@RequestBody List<Integer> tenantIds) throws IOException {
         byte[] fileData = export2ExcelService.exportProjectShared(tenantIds);
         //保存生成excel的地址
-        String fileName = IdUtil.simpleUUID() + ".xls";
+        String fileName = "租户被分享专题库报表.xlsx";
+        //文件原始名中的中文字符可能会乱码,对文件名进行URL编码
+        String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
         return ResponseEntity.ok().contentLength(fileData.length)
-                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"")
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFileName + "\"")
                 .contentType(MediaType.parseMediaType("application/octet-stream"))
                 .body(new InputStreamResource(new ByteArrayInputStream(fileData)));
     }
@@ -118,7 +149,7 @@ public class Export2ExcelController {
     @PostMapping("/getPersonnelNameData")
     @Operation(summary = "获取租户人员报表信息")
     public List<PersonnelNameVO> getPersonnelNameData(@RequestBody List<Integer> tenantIds) {
-        return export2ExcelService.getPersonnelNameData(tenantIds);
+        return parseOutDataForExcelService.getPersonnelNameData(tenantIds);
     }
 
 }

ファイルの差分が大きいため隠しています
+ 511 - 392
PCS/src/main/java/cn/cslg/permission/service/Export2ExcelService.java


+ 133 - 0
PCS/src/main/java/cn/cslg/permission/service/GetOutDataForParseService.java

@@ -0,0 +1,133 @@
+package cn.cslg.permission.service;
+
+import cn.cslg.permission.common.model.dto.QueryRetrieveRecordDTO;
+import com.google.gson.Gson;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 跨系统获取导出报表所需要的数据
+ * @Author xiexiang
+ * @Date 2023/9/18
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class GetOutDataForParseService {
+    private String PASUrl = "http://localhost:8877";
+    private String RMSUrl = "http://localhost:8872";
+    private String PCSUrl = "http://localhost:8871";
+
+    /**
+     * PAS
+     * 检索历史
+     * @return
+     * @throws IOException
+     */
+    public String getRetrieveRecords(QueryRetrieveRecordDTO queryRetrieveRecordDTO) throws IOException {
+        String param = new Gson().toJson(queryRetrieveRecordDTO);
+        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(60, TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
+                .readTimeout(60, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url(PASUrl + "/api/v2/RetrieveRecord/getRetrieveRecord")
+                .post(requestBody)
+                .build();
+        return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
+    }
+
+    /**
+     * PAS
+     * 专题库
+     * @return
+     * @throws IOException
+     */
+    public String getProjectUsedByTenant(List<Integer> tenantIds) throws IOException {
+        String param = new Gson().toJson(tenantIds);
+        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(60, TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
+                .readTimeout(60, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url(PASUrl + "/api/v2/usedByTenant/query")
+                .post(requestBody)
+                .build();
+        return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
+    }
+
+    /**
+     * RMS
+     * 报告
+     * @return
+     * @throws IOException
+     */
+    public String getReportData(List<Integer> tenantIds) throws IOException {
+        String param = new Gson().toJson(tenantIds);
+        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(60, TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
+                .readTimeout(60, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url("http://localhost:8872" + "/api/report/api/report/queryReportNameUsedByTenant")
+                .post(requestBody)
+                .build();
+        return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
+    }
+
+    /**
+     * PAS
+     * 被分享专题库
+     * @return
+     * @throws IOException
+     */
+    public String getProjectSharedTenant(List<Integer> tenantIds) throws IOException {
+        String param = new Gson().toJson(tenantIds);
+        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(60, TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
+                .readTimeout(60, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url(PASUrl + "/api/v2/usedByTenant/projectShared")
+                .post(requestBody)
+                .build();
+        return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
+    }
+
+    /**
+     * RMS
+     * 报告数量
+     * @return
+     * @throws IOException
+     */
+    public String getReportNumOfTotal(Integer tenantId) throws IOException {
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(60, TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
+                .readTimeout(60, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url("http://localhost:8872" + "/api/report/api/report/queryReportNumOfTotal?tenantId=" + tenantId)
+                .get()
+                .build();
+        return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
+    }
+}

+ 17 - 2
PCS/src/main/java/cn/cslg/permission/service/LoginRecordService.java

@@ -3,6 +3,7 @@ package cn.cslg.permission.service;
 import cn.cslg.permission.common.model.dto.QueryLoginRecordDTO;
 import cn.cslg.permission.common.model.vo.LoginRecordVO;
 import cn.cslg.permission.domain.LoginRecord;
+import cn.cslg.permission.domain.Tenant;
 import cn.cslg.permission.exception.XiaoShiException;
 import cn.cslg.permission.mapper.LoginRecordMapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -13,8 +14,10 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author lRJ
@@ -25,6 +28,7 @@ import java.util.List;
 @Service
 @RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class LoginRecordService extends ServiceImpl<LoginRecordMapper,LoginRecord> {
+    private final TenantService tenantService;
 
     /**
      * 新增登录日志
@@ -84,7 +88,7 @@ public class LoginRecordService extends ServiceImpl<LoginRecordMapper,LoginRecor
 
 
     /**
-     * 查询登陆记录,queryType为空或者为0,则根据人员查询,为1,则根据租户查询
+     * 查询登陆记录,queryType为空或者为0,则根据人员查询;为1,则根据租户查询;为2,则查询全部租户
      * @param queryLoginRecordDTO
      * @return
      */
@@ -108,7 +112,18 @@ public class LoginRecordService extends ServiceImpl<LoginRecordMapper,LoginRecor
             } else {
                 throw new XiaoShiException("查询类型错误");
             }
-        } else {
+        } else if(id == null && queryType.equals(2)){//id为空,查询类型为2,查询全部租户下用户的登录日志
+            List<Tenant> tenants = tenantService.list();
+            List<Integer> tenantIds = tenants.stream().map(Tenant::getId).collect(Collectors.toList());
+            LambdaQueryWrapper<LoginRecord> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.in(LoginRecord::getTenantId, tenantIds);
+            queryWrapper.between(LoginRecord::getCreateTime,startTime,endTime);
+            loginRecords = this.list(queryWrapper);
+            loginRecords = loginRecords.stream()
+                    .sorted(Comparator.comparing(LoginRecord::getTenantId))
+                    .collect(Collectors.toList());
+            return loginRecords;
+        }else {
             throw new XiaoShiException("查询条件不能为空");
         }
     }

+ 3 - 6
PCS/src/main/java/cn/cslg/permission/service/LoginService.java

@@ -52,7 +52,6 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
     private final SystemService systemService;
     private final LoginRecordService loginRecordService;
     private final HttpServletRequest request;
-    private final ServletRequest request1;
     /**
      * @param loginVO 登录参数类
      * @return 登录成功的信息
@@ -81,14 +80,12 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
         //登录日志记录租户id
         loginRecordVO.setTenantId(personnel.getTenantId());
         //登录日志记录ip地址
-        loginRecordVO.setLoginIp(request1.getRemoteAddr());
+        loginRecordVO.setLoginIp(request.getRemoteAddr());
         String ua = request.getHeader("User-Agent");
         UserAgent userAgent = UserAgent.parseUserAgentString(ua);
-        System.out.println("-----------------------------------" + loginRecordVO.getLoginIp());
-        System.out.println("-----------------------------------" + userAgent);
-        // 获取客户端操作系统
+        //获取客户端操作系统
         String os = userAgent.getOperatingSystem().getName();
-        // 获取客户端浏览器
+        //获取客户端浏览器
         String browser = userAgent.getBrowser().getName();
         //登录日志记录操作系统
         loginRecordVO.setLoginOs(os);

+ 288 - 0
PCS/src/main/java/cn/cslg/permission/service/ParseOutDataForExcelService.java

@@ -0,0 +1,288 @@
+package cn.cslg.permission.service;
+
+import cn.cslg.permission.common.model.dto.QueryLoginRecordDTO;
+import cn.cslg.permission.common.model.dto.QueryRetrieveRecordDTO;
+import cn.cslg.permission.common.model.vo.*;
+import cn.cslg.permission.domain.LoginRecord;
+import cn.cslg.permission.domain.Personnel;
+import cn.cslg.permission.domain.Tenant;
+import cn.cslg.permission.exception.XiaoShiException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * 导出报表的数据跨系统获取并解析
+ * @Author xiexiang
+ * @Date 2023/9/18
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class ParseOutDataForExcelService {
+    private final GetOutDataForParseService getOutDataForParseService;
+    private final TenantService tenantService;
+    private final PersonnelService personnelService;
+    private final LoginRecordService loginRecordService;
+
+    /**
+     * PAS
+     * 检索历史
+     * @param queryRetrieveRecordDTO
+     * @return
+     * @throws IOException
+     */
+    public List<RetrieveRecordExportVO> getRetrieveRecords(QueryRetrieveRecordDTO queryRetrieveRecordDTO) throws IOException {
+        String data = getOutDataForParseService.getRetrieveRecords(queryRetrieveRecordDTO);
+        Gson gson = new Gson();
+        Type listType = new TypeToken<List<RetrieveRecordExportVO>>(){}.getType();
+        List<RetrieveRecordExportVO> retrieveRecordExportVOS = gson.fromJson(data, listType);
+        return retrieveRecordExportVOS;
+    }
+
+    /**
+     * PAS
+     * 专题库
+     * @return
+     * @throws IOException
+     */
+    public List<ProjectUsedByTenantVO> getProjectData(List<Integer> tenantIds) throws IOException {
+        String data = getOutDataForParseService.getProjectUsedByTenant(tenantIds);
+        Gson gson = new Gson();
+        Type listType = new TypeToken<List<ProjectUsedByTenantVO>>(){}.getType();
+        List<ProjectUsedByTenantVO> projectUsedByTenantVOS = gson.fromJson(data, listType);
+
+        return projectUsedByTenantVOS;
+    }
+
+    /**
+     * RMS
+     * 报告
+     * @return
+     * @throws IOException
+     */
+    public List<ReportUsedByTenantVO> reportStr2Object(List<Integer> tenantIds) throws IOException {
+        String reData = getOutDataForParseService.getReportData(tenantIds);
+        Gson gson = new Gson();
+        Type listType = new TypeToken<List<ReportUsedByTenantVO>>(){}.getType();
+        List<ReportUsedByTenantVO> reportUsedByTenantVOS = gson.fromJson(reData, listType);
+        return reportUsedByTenantVOS;
+    }
+
+    /**
+     * PAS
+     * 被分享专题库
+     * @return
+     * @throws IOException
+     */
+    public List<ProjectSharedTenantVO> getProjectSharedData(List<Integer> tenantIds) throws IOException {
+        String data = getOutDataForParseService.getProjectSharedTenant(tenantIds);
+        Gson gson = new Gson();
+        Type listType = new TypeToken<List<ProjectSharedTenantVO>>(){}.getType();
+        List<ProjectSharedTenantVO> projectSharedTenantVOS = gson.fromJson(data, listType);
+        return projectSharedTenantVOS;
+    }
+
+
+
+    /**
+     * 查出所有租户,并且查出租户下的人员
+     */
+    public List<ReportTenantVO> getTenantPerson(List<Integer> tenantIds){
+        List<ReportTenantVO> reportTenantVOS = new ArrayList<>();
+        //放入空集合,查询全部
+        List<Tenant> tenants = tenantService.getTenantIdAndName(tenantIds);
+        //遍历,装载
+        for(Tenant tenant : tenants){
+            ReportTenantVO reportTenantVO = new ReportTenantVO();
+            //租户id
+            reportTenantVO.setTenantId(tenant.getId());
+            //租户名
+            reportTenantVO.setTenantName(tenant.getTenantName());
+            //人员ids
+            LambdaQueryWrapper<Personnel> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(Personnel::getTenantId, tenant.getId());
+            List<Personnel> personnels = personnelService.list(queryWrapper);
+            List<Integer> personnelIds = personnels.stream().map(Personnel::getId).collect(Collectors.toList());
+            reportTenantVO.setPersonnelIds(personnelIds);
+            reportTenantVOS.add(reportTenantVO);
+        }
+        return reportTenantVOS;
+    }
+
+
+    /**
+     * 查询租户人员信息
+     * @param tenantIds
+     * @return
+     */
+    public List<PersonnelNameVO> getPersonnelNameData(List<Integer> tenantIds){
+        List<PersonnelNameVO> personnelNameVOS = new ArrayList<>();
+        if(tenantIds.size() == 0){
+            List<Tenant> tenants = tenantService.list();
+            tenantIds = tenants.stream().map(Tenant::getId).collect(Collectors.toList());
+            System.out.println(tenantIds);
+        }
+        for(Integer tenantId : tenantIds){
+            //租户名
+            Tenant tenant = tenantService.getById(tenantId);
+            String tenantName = tenant.getTenantName();
+            LambdaQueryWrapper<Personnel> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(Personnel::getTenantId, tenantId);
+            Long count = personnelService.count(queryWrapper);
+            if(count > 0){
+                //人员数量
+                Integer personnelNum = Long.valueOf(count).intValue();
+                List<Personnel> personnels = personnelService.list(queryWrapper);
+                for(Personnel personnel : personnels){
+                    PersonnelNameVO personnelNameVO = new PersonnelNameVO();
+                    //租户
+                    personnelNameVO.setTenantName(tenantName);
+                    //人员数量
+                    personnelNameVO.setPersonnelNum(personnelNum);
+                    //人员名称
+                    personnelNameVO.setPersonnelName(personnel.getPersonnelName());
+                    //账号
+                    personnelNameVO.setPersonnelUserName(personnel.getPersonnelUserName());
+                    personnelNameVOS.add(personnelNameVO);
+                }
+            } else {
+                PersonnelNameVO personnelNameVO = new PersonnelNameVO();
+                //租户
+                personnelNameVO.setTenantName(tenantName);
+                //人员数量
+                personnelNameVO.setPersonnelNum(0);
+                personnelNameVOS.add(personnelNameVO);
+            }
+        }
+        return personnelNameVOS;
+    }
+
+    /**
+     * 装载单个租户的汇总报表数据
+     * @param tenantId
+     * @return
+     * @throws IOException
+     */
+    public TotalDataVO getTotalData(Integer tenantId) throws IOException {
+        TotalDataVO totalDataVO = new TotalDataVO();
+        Tenant tenant = tenantService.getById(tenantId);
+        if(tenant != null) {
+            List<Integer> tenantIds = new ArrayList<>();
+            tenantIds.add(tenant.getId());
+            //租户名
+            totalDataVO.setTenantName(tenant.getTenantName());
+            //租户下人员数量
+            List<PersonnelNameVO> personnelNameVOS = this.getPersonnelNameData(tenantIds);
+            totalDataVO.setPersonnelNum(personnelNameVOS.get(0).getPersonnelNum());
+            //报告数量
+            String reportNumStr = getOutDataForParseService.getReportNumOfTotal(tenantId);
+            Integer reportNum = Integer.parseInt(reportNumStr);
+            totalDataVO.setReportNum(reportNum);
+            //专题库数量
+            List<ProjectUsedByTenantVO> projectUsedByTenantVOS = this.getProjectData(tenantIds);
+            Integer projectNum = projectUsedByTenantVOS.get(0).getProjectNum();
+            totalDataVO.setProjectNum(projectNum);
+            //被分享专题库数量
+            List<ProjectSharedTenantVO> projectSharedTenantVOS = this.getProjectSharedData(tenantIds);
+            Integer projectSharedNum = projectSharedTenantVOS.get(0).getProjectNum();
+            totalDataVO.setProjectSharedNum(projectSharedNum);
+        }
+        return totalDataVO;
+    }
+
+
+    /**
+     * 装载登录日志Excel信息
+     * @param queryLoginRecordDTO
+     * @return
+     */
+    public List<LoginRecordExportVO> loadLoginRecordData(QueryLoginRecordDTO queryLoginRecordDTO){
+        List<LoginRecordExportVO> loginRecordExportVOS = new ArrayList<>();
+        List<LoginRecord> loginRecords = new ArrayList<>();
+        if(queryLoginRecordDTO != null){
+            loginRecords = loginRecordService.getLoginRecord(queryLoginRecordDTO);
+        } else {
+            throw new XiaoShiException("导出失败");
+        }
+        for(LoginRecord loginRecord : loginRecords){
+            LoginRecordExportVO loginRecordExportVO = new LoginRecordExportVO();
+            if(loginRecord != null){
+                BeanUtils.copyProperties(loginRecord, loginRecordExportVO);
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                //创建时间
+                loginRecordExportVO.setCreateTime(sdf.format(loginRecord.getCreateTime()));
+                Tenant tenant = tenantService.getById(loginRecord.getTenantId());
+                //租户名称
+                loginRecordExportVO.setTenantName(tenant.getTenantName());
+                Personnel personnel = personnelService.getById(loginRecord.getPersonnelId());
+                //登陆人名称
+                loginRecordExportVO.setPersonnelUserName(personnel.getPersonnelUserName());
+                if(loginRecord.getLoginSystem() != null){
+                    //登陆系统
+                    if(loginRecord.getLoginSystem().equals(0)){
+                        loginRecordExportVO.setLoginSystemName("权限系统");
+                        loginRecordExportVOS.add(loginRecordExportVO);
+                    } else if(loginRecord.getLoginSystem().equals(1)){
+                        loginRecordExportVO.setLoginSystemName("分析系统");
+                        loginRecordExportVOS.add(loginRecordExportVO);
+                    } else if(loginRecord.getLoginSystem().equals(2)){
+                        loginRecordExportVO.setLoginSystemName("报告系统");
+                        loginRecordExportVOS.add(loginRecordExportVO);
+                    } else {
+                        loginRecordExportVO.setLoginSystemName(" ");
+                        loginRecordExportVOS.add(loginRecordExportVO);
+                    }
+                } else {
+                    loginRecordExportVO.setLoginSystemName(" ");
+                    loginRecordExportVOS.add(loginRecordExportVO);
+                }
+            }
+        }
+        return loginRecordExportVOS;
+    }
+
+    /**
+     * 判断需要查询的租户id数量,如果为空就是查询所有租户,并且装载租户名和用户名
+     * @param queryRetrieveRecordDTO
+     * @return
+     * @throws IOException
+     */
+    public List<RetrieveRecordExportVO> loadRetrieveRecords(QueryRetrieveRecordDTO queryRetrieveRecordDTO) throws IOException {
+        List<Integer> tenantIds = queryRetrieveRecordDTO.getTenantIds();
+        List<RetrieveRecordExportVO> retrieveRecordExportVOS = new ArrayList<>();
+        if(tenantIds.size() == 0){
+            List<Tenant> tenants = tenantService.getTenantIdAndName(tenantIds);
+            List<Integer> ids = tenants.stream().map(Tenant::getId).collect(Collectors.toList());
+            queryRetrieveRecordDTO.setTenantIds(ids);
+            retrieveRecordExportVOS = this.getRetrieveRecords(queryRetrieveRecordDTO);
+        } else {
+            retrieveRecordExportVOS = this.getRetrieveRecords(queryRetrieveRecordDTO);
+        }
+        retrieveRecordExportVOS.stream().forEach(retrieveRecordExportVO -> {
+                    Tenant tenant = tenantService.getById(retrieveRecordExportVO.getTenantId());
+                    retrieveRecordExportVO.setTenantName(tenant.getTenantName());
+                    Personnel personnel = personnelService.getById(retrieveRecordExportVO.getCreateId());
+                    retrieveRecordExportVO.setCreateName(personnel.getPersonnelName());
+                });
+        return retrieveRecordExportVOS;
+    }
+}