package com.galaxis.manatee.service; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.galaxis.manatee.constant.ChuanYunConstant; import com.galaxis.manatee.dao.ChuanyunGroupProjectDao; import com.galaxis.manatee.dao.ChuanyunLogDao; import com.galaxis.manatee.dao.ChuanyunUserCompanyDao; import com.galaxis.manatee.dao.ChuanyunUserDepartmentNameDao; import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunGroupProjectDO; import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunLogDO; import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunUserCompanyDO; import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunUserDepartmentNameDO; import com.galaxis.manatee.entity.chuanyun.dto.Filter; import com.galaxis.manatee.manager.ChuanYunManager; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.time.Instant; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; /** * 下载日志原始数据 * @author zcj * @version 0.1 * @date 2021/3/13 2:14 上午 */ @Slf4j @Service public class LogDownloadService { private final ChuanYunManager chuanYunManager; private final ChuanyunLogDao chuanyunLogDao; private final ChuanyunUserCompanyDao chuanyunUserCompanyDao; private final ChuanyunGroupProjectDao chuanyunGroupProjectDao; private final ChuanyunUserDepartmentNameDao chuanyunUserDepartmentNameDao; public LogDownloadService(ChuanYunManager chuanYunManager, ChuanyunLogDao chuanyunLogDao, ChuanyunUserCompanyDao chuanyunUserCompanyDao, ChuanyunGroupProjectDao chuanyunGroupProjectDao, ChuanyunUserDepartmentNameDao chuanyunUserDepartmentNameDao) { this.chuanYunManager = chuanYunManager; this.chuanyunLogDao = chuanyunLogDao; this.chuanyunUserCompanyDao = chuanyunUserCompanyDao; this.chuanyunGroupProjectDao = chuanyunGroupProjectDao; this.chuanyunUserDepartmentNameDao = chuanyunUserDepartmentNameDao; } /** * 更新日志数据 * @param isRecent 是否只更新最近30天 */ public void saveChuanyunLogDO(boolean isRecent){ var objectMapper = new ObjectMapper(); var start = 0; var totalCount = 0L; var flag = true; var pageSize=100; List matchersString=new ArrayList<>(); //由于需要统计流程中的日志,在日志数据同步时将状态为2的数据一并统计 matchersString.add("Status_6,[1;2;3]"); if(isRecent){ //获取当前时间30天前日期 DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime now = LocalDateTime.now(); now = now.minus(30, ChronoUnit.DAYS); matchersString.add("logDate_1,"+df.format(now)); } while (flag) { long startTime= Instant.now().getEpochSecond(); try { //从氚云查询数据 var filter= Filter.instance(start,start+pageSize,true,Filter.AND,matchersString); var chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunLogDO.SCHEMA_CODE, filter); if (chuanyunFindAllResponse.getReturnData() == null) { flag = false; continue; } if (chuanyunFindAllResponse.getReturnData().getTotalCount() >= start + pageSize) { start += pageSize; } else { flag = false; } //转化为POJO List result = objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>() { }); //处理日志数据 result.forEach(this::updateChuanyunLogData); //获取项目总数 totalCount = chuanyunFindAllResponse.getReturnData().getTotalCount(); //保存 chuanyunLogDao.saveAll(result); } catch (Exception e) { log.error(e.getMessage()); e.printStackTrace(); } log.info("日志100条保存时间"+(Instant.now().getEpochSecond()-startTime)+"秒"); } log.info("最近一月历史日志信息保存" + totalCount); } /** * 更新氚云日志数据 * @param chuanyunLogDO 待处理数据 */ private void updateChuanyunLogData(ChuanyunLogDO chuanyunLogDO){ if(chuanyunLogDO.getDayLogList()==null||chuanyunLogDO.getDayLogList().size()==0){ chuanyunLogDO.setDayLogList(new ArrayList<>()); log.warn(chuanyunLogDO+""); log.warn("异常数据"); }else{ //如果有重复就删除 chuanyunLogDao.findById(chuanyunLogDO.getObjectId()).ifPresent(chuanyunLogDao::delete); //根据projectId获取code,如果是生产项目,则不用处理 //针对前期测试数据,可能出现日志为空的情况,跳过不处理 chuanyunLogDO.getDayLogList().forEach(chuanyunDayLog -> { //离职人员补全用户Id及部门ID if (StringUtils.isEmpty(chuanyunLogDO.getUserId())){ var name=""; if (StringUtils.isEmpty(chuanyunDayLog.getContent())){ name=chuanyunLogDO.getName(); }else { name=chuanyunDayLog.getContent(); } chuanyunLogDO.setUserId(getCharacters(name)); ChuanyunUserDepartmentNameDO chuanyunUserDepartmentNameDO = chuanyunUserDepartmentNameDao.findByUserName(chuanyunLogDO.getUserId()); if (chuanyunUserDepartmentNameDO!=null){ chuanyunLogDO.setDepartmentName(chuanyunUserDepartmentNameDO.getDepartmentName()); } }else { ChuanyunUserCompanyDO chuanyunUserCompanyDO = chuanyunUserCompanyDao.findByUserId(chuanyunLogDO.getUserObject().getObjectId()); if (chuanyunUserCompanyDO!=null){ chuanyunLogDO.setDepartmentName(getDepartmentName(chuanyunUserCompanyDO.getDepartment())); } } try{ if(!ChuanYunConstant.PRODUCTION_PROJECT.equals(chuanyunDayLog.getProjectType())&& StringUtils.isEmpty(chuanyunDayLog.getProjectId())){ log.info(chuanyunLogDO+""); }else if(!ChuanYunConstant.PRODUCTION_PROJECT.equals(chuanyunDayLog.getProjectType())){ ChuanyunGroupProjectDO chuanyunGroupProjectDO=chuanyunGroupProjectDao.findById(chuanyunDayLog.getProjectId()).orElseThrow(); chuanyunDayLog.setProjectCode(chuanyunGroupProjectDO.getProjectCode()); } }catch (Exception e){ e.printStackTrace(); log.warn(chuanyunDayLog+""); } }); } //处理项目userId if(chuanyunLogDO.getUserObject()!=null){ chuanyunLogDO.setUserId(chuanyunLogDO.getUserObject().getObjectId()); } } private String getCharacters(String str){ String reg = "[^\u4e00-\u9fa5]"; str = str.replaceAll(reg, " "); return str.trim(); } private String getDepartmentName(String str){ if (str.contains("/")){ String[] department = str.split("/"); return department[department.length-1]; }else { return str; } } }