|
@@ -7,12 +7,10 @@ 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.data.object.*;
|
|
|
import com.galaxis.manatee.entity.chuanyun.dto.Filter;
|
|
|
import com.galaxis.manatee.manager.ChuanYunManager;
|
|
|
+import com.galaxis.manatee.util.TimeUtil;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.util.StringUtils;
|
|
@@ -23,9 +21,12 @@ import java.time.format.DateTimeFormatter;
|
|
|
import java.time.temporal.ChronoUnit;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.Optional;
|
|
|
|
|
|
/**
|
|
|
* 下载日志原始数据
|
|
|
+ *
|
|
|
* @author zcj
|
|
|
* @version 0.1
|
|
|
* @date 2021/3/13 2:14 上午
|
|
@@ -36,47 +37,48 @@ public class LogDownloadService {
|
|
|
|
|
|
private final ChuanYunManager chuanYunManager;
|
|
|
private final ChuanyunLogDao chuanyunLogDao;
|
|
|
- private final ChuanyunUserCompanyDao chuanyunUserCompanyDao;
|
|
|
+ private final ChuanyunUserCompanyDao userCompanyDao;
|
|
|
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.userCompanyDao = chuanyunUserCompanyDao;
|
|
|
this.chuanyunGroupProjectDao = chuanyunGroupProjectDao;
|
|
|
this.chuanyunUserDepartmentNameDao = chuanyunUserDepartmentNameDao;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 更新日志数据
|
|
|
- * @param isRecent 是否只更新最近30天
|
|
|
+ *
|
|
|
+ * @param isRecent 是否只更新最近30天
|
|
|
*/
|
|
|
- public void saveChuanyunLogDO(boolean isRecent){
|
|
|
+ public void saveChuanyunLogDO(boolean isRecent) {
|
|
|
var objectMapper = new ObjectMapper();
|
|
|
var start = 0;
|
|
|
var totalCount = 0L;
|
|
|
var flag = true;
|
|
|
- var pageSize=100;
|
|
|
- List<String> matchersString=new ArrayList<>();
|
|
|
+ var pageSize = 100;
|
|
|
+ List<String> matchersString = new ArrayList<>();
|
|
|
//由于需要统计流程中的日志,在日志数据同步时将状态为2的数据一并统计
|
|
|
matchersString.add("Status_6,[1;2;3]");
|
|
|
// 默认获取半年的日志
|
|
|
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
// 按要求同步两个月的记录
|
|
|
- LocalDateTime localDateTime = LocalDateTime.now().minusDays(60);
|
|
|
+ LocalDateTime localDateTime = LocalDateTime.now().minusDays(90);
|
|
|
matchersString.add("logDate_1," + df.format(localDateTime));
|
|
|
- if(isRecent){
|
|
|
+ if (isRecent) {
|
|
|
//获取当前时间30天前日期
|
|
|
LocalDateTime now = LocalDateTime.now();
|
|
|
now = now.minus(30, ChronoUnit.DAYS);
|
|
|
- matchersString.add("logDate_1,"+df.format(now));
|
|
|
+ matchersString.add("logDate_1," + df.format(now));
|
|
|
}
|
|
|
while (flag) {
|
|
|
- long startTime= Instant.now().getEpochSecond();
|
|
|
+ long startTime = Instant.now().getEpochSecond();
|
|
|
try {
|
|
|
//从氚云查询数据
|
|
|
- var filter= Filter.instance(start,start+pageSize,true,Filter.AND,matchersString);
|
|
|
+ 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;
|
|
@@ -100,83 +102,154 @@ public class LogDownloadService {
|
|
|
log.error(e.getMessage());
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
- log.info("日志100条保存时间"+(Instant.now().getEpochSecond()-startTime)+"秒");
|
|
|
+ log.info("日志100条保存时间" + (Instant.now().getEpochSecond() - startTime) + "秒");
|
|
|
}
|
|
|
log.info("最近一月历史日志信息保存" + totalCount);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 更新氚云日志数据
|
|
|
+ *
|
|
|
* @param chuanyunLogDO 待处理数据
|
|
|
*/
|
|
|
- private void updateChuanyunLogData(ChuanyunLogDO chuanyunLogDO){
|
|
|
+ private void updateChuanyunLogData(ChuanyunLogDO chuanyunLogDO) {
|
|
|
//处理项目userId
|
|
|
- if(chuanyunLogDO.getUserObject()!=null){
|
|
|
+ if (chuanyunLogDO.getUserObject() != null) {
|
|
|
chuanyunLogDO.setUserId(chuanyunLogDO.getUserObject().getObjectId());
|
|
|
}
|
|
|
//日志人员所属部门名称
|
|
|
- if (!StringUtils.isEmpty(chuanyunLogDO.getDepartment())){
|
|
|
+ if (!StringUtils.isEmpty(chuanyunLogDO.getDepartment())) {
|
|
|
chuanyunLogDO.setDepartmentName(chuanyunLogDO.getDepartment());
|
|
|
- }else {
|
|
|
+ } else {
|
|
|
chuanyunLogDao.findById(chuanyunLogDO.getObjectId()).ifPresent(oldLogDO -> {
|
|
|
chuanyunLogDO.setDepartmentName(oldLogDO.getDepartmentName());
|
|
|
});
|
|
|
}
|
|
|
+
|
|
|
+ // 补全部门信息
|
|
|
+ if (Objects.isNull(chuanyunLogDO.getDepartmentName()) || chuanyunLogDO.getDepartmentName().isBlank()) {
|
|
|
+ // 任没有部门,查询该用户所属公司获取部门
|
|
|
+ Optional<ChuanyunUserCompanyDO> first = userCompanyDao.findAllByUserIdOrderByModifiedTimeDesc(chuanyunLogDO.getUserId()).stream().findFirst();
|
|
|
+ first.ifPresent(chuanyunUserCompanyDO -> {
|
|
|
+ String[] split = chuanyunUserCompanyDO.getDepartment().split("/");
|
|
|
+ int length = split.length;
|
|
|
+ chuanyunLogDO.setDepartmentName(split[length - 1]);
|
|
|
+ });
|
|
|
+ }
|
|
|
//处理数据
|
|
|
- if(chuanyunLogDO.getDayLogList()==null||chuanyunLogDO.getDayLogList().size()==0){
|
|
|
+ if (chuanyunLogDO.getDayLogList() == null || chuanyunLogDO.getDayLogList().size() == 0) {
|
|
|
chuanyunLogDO.setDayLogList(new ArrayList<>());
|
|
|
- log.warn(chuanyunLogDO+"");
|
|
|
+ log.warn(chuanyunLogDO + "");
|
|
|
log.warn("异常数据");
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
//如果有重复就删除
|
|
|
- // todo 保存判断是否无变更,无变更返回0则修改该条数据为没变化的数据。
|
|
|
-
|
|
|
chuanyunLogDao.findById(chuanyunLogDO.getObjectId()).ifPresent(chuanyunLogDao::delete);
|
|
|
//根据projectId获取code,如果是生产项目,则不用处理
|
|
|
//针对前期测试数据,可能出现日志为空的情况,跳过不处理
|
|
|
chuanyunLogDO.getDayLogList().forEach(chuanyunDayLog -> {
|
|
|
+ // 补全工作组
|
|
|
+ if (ChuanYunConstant.LOG_WEEK_TYPE.contains(chuanyunLogDO.getDayOrWeek()) && ChuanYunConstant.NEED_WORK_GROUP_PROJECT_TYPE.contains(chuanyunDayLog.getProjectType())) {
|
|
|
+ List<ChuanyunWeekLogDO> weekLogList = chuanyunLogDO.getWeekLogList();
|
|
|
+ for (ChuanyunWeekLogDO chuanyunWeekLogDO : weekLogList) {
|
|
|
+ if (Objects.equals(chuanyunDayLog.getProjectId(), chuanyunWeekLogDO.getProjectId())) {
|
|
|
+ chuanyunDayLog.setWorkGroupId(chuanyunWeekLogDO.getWorkGroupId());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
//离职人员补全用户Id及部门ID
|
|
|
- if (StringUtils.isEmpty(chuanyunLogDO.getUserId())){
|
|
|
- var name="";
|
|
|
- if (StringUtils.isEmpty(chuanyunDayLog.getContent())){
|
|
|
- name=chuanyunLogDO.getName();
|
|
|
- }else {
|
|
|
- name=chuanyunDayLog.getContent();
|
|
|
+ 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){
|
|
|
+ if (chuanyunUserDepartmentNameDO != null) {
|
|
|
chuanyunLogDO.setDepartmentName(chuanyunUserDepartmentNameDO.getDepartmentName());
|
|
|
}
|
|
|
}
|
|
|
- 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();
|
|
|
+ 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){
|
|
|
+ } catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
- log.warn(chuanyunDayLog+"");
|
|
|
+ log.warn(chuanyunDayLog + "");
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
- private String getCharacters(String str){
|
|
|
+ private String getCharacters(String str) {
|
|
|
String reg = "[^\u4e00-\u9fa5]";
|
|
|
str = str.replaceAll(reg, " ");
|
|
|
return str.trim();
|
|
|
}
|
|
|
|
|
|
- private String getDepartmentName(String str){
|
|
|
- if (str.contains("/")){
|
|
|
+ private String getDepartmentName(String str) {
|
|
|
+ if (str.contains("/")) {
|
|
|
String[] department = str.split("/");
|
|
|
- return department[department.length-1];
|
|
|
- }else {
|
|
|
+ return department[department.length - 1];
|
|
|
+ } else {
|
|
|
return str;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新日志数据
|
|
|
+ */
|
|
|
+ public void saveDayLog() {
|
|
|
+ var objectMapper = new ObjectMapper();
|
|
|
+ var start = 0;
|
|
|
+ var totalCount = 0L;
|
|
|
+ var flag = true;
|
|
|
+ var pageSize = 100;
|
|
|
+ List<String> matchersString = new ArrayList<>();
|
|
|
+ //由于需要统计流程中的日志,在日志数据同步时将状态为2的数据一并统计
|
|
|
+ matchersString.add("Status_6,[1;2;3]");
|
|
|
+ LocalDateTime localDateTimeStart = LocalDateTime.of(2022, 5, 1, 0, 0, 0);
|
|
|
+ LocalDateTime localDateTimeEnd = LocalDateTime.of(2022, 6, 30, 23, 59, 59);
|
|
|
+ matchersString.add("logDate_1," + TimeUtil.formatDateTime(localDateTimeStart));
|
|
|
+ matchersString.add("logDate_3," + TimeUtil.formatDateTime(localDateTimeEnd));
|
|
|
+ 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<ChuanyunLogDO> 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);
|
|
|
+ }
|
|
|
}
|