LogDownloadService.java 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package com.galaxis.manatee.service;
  2. import com.fasterxml.jackson.core.type.TypeReference;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.galaxis.manatee.constant.ChuanYunConstant;
  5. import com.galaxis.manatee.dao.ChuanyunGroupProjectDao;
  6. import com.galaxis.manatee.dao.ChuanyunLogDao;
  7. import com.galaxis.manatee.dao.ChuanyunUserCompanyDao;
  8. import com.galaxis.manatee.dao.ChuanyunUserDepartmentNameDao;
  9. import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunGroupProjectDO;
  10. import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunLogDO;
  11. import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunUserCompanyDO;
  12. import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunUserDepartmentNameDO;
  13. import com.galaxis.manatee.entity.chuanyun.dto.Filter;
  14. import com.galaxis.manatee.manager.ChuanYunManager;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.springframework.stereotype.Service;
  17. import org.springframework.util.StringUtils;
  18. import java.time.Instant;
  19. import java.time.LocalDateTime;
  20. import java.time.format.DateTimeFormatter;
  21. import java.time.temporal.ChronoUnit;
  22. import java.util.ArrayList;
  23. import java.util.List;
  24. /**
  25. * 下载日志原始数据
  26. * @author zcj
  27. * @version 0.1
  28. * @date 2021/3/13 2:14 上午
  29. */
  30. @Slf4j
  31. @Service
  32. public class LogDownloadService {
  33. private final ChuanYunManager chuanYunManager;
  34. private final ChuanyunLogDao chuanyunLogDao;
  35. private final ChuanyunUserCompanyDao chuanyunUserCompanyDao;
  36. private final ChuanyunGroupProjectDao chuanyunGroupProjectDao;
  37. private final ChuanyunUserDepartmentNameDao chuanyunUserDepartmentNameDao;
  38. public LogDownloadService(ChuanYunManager chuanYunManager, ChuanyunLogDao chuanyunLogDao, ChuanyunUserCompanyDao chuanyunUserCompanyDao, ChuanyunGroupProjectDao chuanyunGroupProjectDao, ChuanyunUserDepartmentNameDao chuanyunUserDepartmentNameDao) {
  39. this.chuanYunManager = chuanYunManager;
  40. this.chuanyunLogDao = chuanyunLogDao;
  41. this.chuanyunUserCompanyDao = chuanyunUserCompanyDao;
  42. this.chuanyunGroupProjectDao = chuanyunGroupProjectDao;
  43. this.chuanyunUserDepartmentNameDao = chuanyunUserDepartmentNameDao;
  44. }
  45. /**
  46. * 更新日志数据
  47. * @param isRecent 是否只更新最近30天
  48. */
  49. public void saveChuanyunLogDO(boolean isRecent){
  50. var objectMapper = new ObjectMapper();
  51. var start = 0;
  52. var totalCount = 0L;
  53. var flag = true;
  54. var pageSize=100;
  55. List<String> matchersString=new ArrayList<>();
  56. //由于需要统计流程中的日志,在日志数据同步时将状态为2的数据一并统计
  57. matchersString.add("Status_6,[1;2;3]");
  58. if(isRecent){
  59. //获取当前时间30天前日期
  60. DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  61. LocalDateTime now = LocalDateTime.now();
  62. now = now.minus(30, ChronoUnit.DAYS);
  63. matchersString.add("logDate_1,"+df.format(now));
  64. }
  65. while (flag) {
  66. long startTime= Instant.now().getEpochSecond();
  67. try {
  68. //从氚云查询数据
  69. var filter= Filter.instance(start,start+pageSize,true,Filter.AND,matchersString);
  70. var chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunLogDO.SCHEMA_CODE, filter);
  71. if (chuanyunFindAllResponse.getReturnData() == null) {
  72. flag = false;
  73. continue;
  74. }
  75. if (chuanyunFindAllResponse.getReturnData().getTotalCount() >= start + pageSize) {
  76. start += pageSize;
  77. } else {
  78. flag = false;
  79. }
  80. //转化为POJO
  81. List<ChuanyunLogDO> result = objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
  82. });
  83. //处理日志数据
  84. result.forEach(this::updateChuanyunLogData);
  85. //获取项目总数
  86. totalCount = chuanyunFindAllResponse.getReturnData().getTotalCount();
  87. //保存
  88. chuanyunLogDao.saveAll(result);
  89. } catch (Exception e) {
  90. log.error(e.getMessage());
  91. e.printStackTrace();
  92. }
  93. log.info("日志100条保存时间"+(Instant.now().getEpochSecond()-startTime)+"秒");
  94. }
  95. log.info("最近一月历史日志信息保存" + totalCount);
  96. }
  97. /**
  98. * 更新氚云日志数据
  99. * @param chuanyunLogDO 待处理数据
  100. */
  101. private void updateChuanyunLogData(ChuanyunLogDO chuanyunLogDO){
  102. if(chuanyunLogDO.getDayLogList()==null||chuanyunLogDO.getDayLogList().size()==0){
  103. chuanyunLogDO.setDayLogList(new ArrayList<>());
  104. log.warn(chuanyunLogDO+"");
  105. log.warn("异常数据");
  106. }else{
  107. //如果有重复就删除
  108. chuanyunLogDao.findById(chuanyunLogDO.getObjectId()).ifPresent(chuanyunLogDao::delete);
  109. //根据projectId获取code,如果是生产项目,则不用处理
  110. //针对前期测试数据,可能出现日志为空的情况,跳过不处理
  111. chuanyunLogDO.getDayLogList().forEach(chuanyunDayLog -> {
  112. //离职人员补全用户Id及部门ID
  113. if (StringUtils.isEmpty(chuanyunLogDO.getUserId())){
  114. var name="";
  115. if (StringUtils.isEmpty(chuanyunDayLog.getContent())){
  116. name=chuanyunLogDO.getName();
  117. }else {
  118. name=chuanyunDayLog.getContent();
  119. }
  120. chuanyunLogDO.setUserId(getCharacters(name));
  121. ChuanyunUserDepartmentNameDO chuanyunUserDepartmentNameDO = chuanyunUserDepartmentNameDao.findByUserName(chuanyunLogDO.getUserId());
  122. if (chuanyunUserDepartmentNameDO!=null){
  123. chuanyunLogDO.setDepartmentName(chuanyunUserDepartmentNameDO.getDepartmentName());
  124. }
  125. }else {
  126. ChuanyunUserCompanyDO chuanyunUserCompanyDO = chuanyunUserCompanyDao.findByUserId(chuanyunLogDO.getUserObject().getObjectId());
  127. if (chuanyunUserCompanyDO!=null){
  128. chuanyunLogDO.setDepartmentName(getDepartmentName(chuanyunUserCompanyDO.getDepartment()));
  129. }
  130. }
  131. try{
  132. if(!ChuanYunConstant.PRODUCTION_PROJECT.equals(chuanyunDayLog.getProjectType())&& StringUtils.isEmpty(chuanyunDayLog.getProjectId())){
  133. log.info(chuanyunLogDO+"");
  134. }else if(!ChuanYunConstant.PRODUCTION_PROJECT.equals(chuanyunDayLog.getProjectType())){
  135. ChuanyunGroupProjectDO chuanyunGroupProjectDO=chuanyunGroupProjectDao.findById(chuanyunDayLog.getProjectId()).orElseThrow();
  136. chuanyunDayLog.setProjectCode(chuanyunGroupProjectDO.getProjectCode());
  137. }
  138. }catch (Exception e){
  139. e.printStackTrace();
  140. log.warn(chuanyunDayLog+"");
  141. }
  142. });
  143. }
  144. //处理项目userId
  145. if(chuanyunLogDO.getUserObject()!=null){
  146. chuanyunLogDO.setUserId(chuanyunLogDO.getUserObject().getObjectId());
  147. }
  148. }
  149. private String getCharacters(String str){
  150. String reg = "[^\u4e00-\u9fa5]";
  151. str = str.replaceAll(reg, " ");
  152. return str.trim();
  153. }
  154. private String getDepartmentName(String str){
  155. if (str.contains("/")){
  156. String[] department = str.split("/");
  157. return department[department.length-1];
  158. }else {
  159. return str;
  160. }
  161. }
  162. }