|
@@ -0,0 +1,573 @@
|
|
|
|
+package com.galaxis.manatee.task;
|
|
|
|
+
|
|
|
|
+import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
|
+import com.fasterxml.jackson.core.type.TypeReference;
|
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
|
+import com.galaxis.manatee.constant.ChuanYunConstant;
|
|
|
|
+import com.galaxis.manatee.dao.*;
|
|
|
|
+import com.galaxis.manatee.entity.chuanyun.data.object.*;
|
|
|
|
+import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunFindAllBizDTO;
|
|
|
|
+import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunSaveDTO;
|
|
|
|
+import com.galaxis.manatee.entity.chuanyun.dto.Filter;
|
|
|
|
+import com.galaxis.manatee.exception.BigSizeException;
|
|
|
|
+import com.galaxis.manatee.manager.ChuanYunManager;
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
|
+import org.springframework.data.domain.PageRequest;
|
|
|
|
+import org.springframework.scheduling.annotation.Scheduled;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
|
+
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
+import java.math.RoundingMode;
|
|
|
|
+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;
|
|
|
|
+
|
|
|
|
+@Service
|
|
|
|
+@Slf4j
|
|
|
|
+public class WorkHourStatisticsRecently {
|
|
|
|
+
|
|
|
|
+ private final Integer pageSize = 100;
|
|
|
|
+ private final ChuanYunManager chuanYunManager;
|
|
|
|
+ private final ChuanyunLogDao chuanyunLogDao;
|
|
|
|
+ private final ChuanyunGroupProjectDao chuanyunGroupProjectDao;
|
|
|
|
+ private final ChuanyunUserCompanyDao chuanyunUserCompanyDao;
|
|
|
|
+ private final ChuanyunWorkHourDao chuanyunWorkHourDao;
|
|
|
|
+ private final ChuanyunSelfWorkHourDao chuanyunSelfWorkHourDao;
|
|
|
|
+ private final ObjectMapper objectMapper=new ObjectMapper();
|
|
|
|
+ private final ChuanyunWeekMemberHourDao chuanyunWeekMemberHourDao;
|
|
|
|
+ private final ChuanyunSelfCostDao chuanyunSelfCostDao;
|
|
|
|
+
|
|
|
|
+ public WorkHourStatisticsRecently(ChuanYunManager chuanYunManager, ChuanyunLogDao chuanyunLogDao, ChuanyunGroupProjectDao chuanyunGroupProjectDao, ChuanyunUserCompanyDao chuanyunUserCompanyDao, ChuanyunWorkHourDao chuanyunWorkHourDao, ChuanyunSelfWorkHourDao chuanyunSelfWorkHourDao, ChuanyunWeekMemberHourDao chuanyunWeekMemberHourDao, ChuanyunSelfCostDao chuanyunSelfCostDao) {
|
|
|
|
+ this.chuanYunManager = chuanYunManager;
|
|
|
|
+ this.chuanyunLogDao = chuanyunLogDao;
|
|
|
|
+ this.chuanyunGroupProjectDao = chuanyunGroupProjectDao;
|
|
|
|
+ this.chuanyunUserCompanyDao = chuanyunUserCompanyDao;
|
|
|
|
+ this.chuanyunWorkHourDao = chuanyunWorkHourDao;
|
|
|
|
+ this.chuanyunSelfWorkHourDao = chuanyunSelfWorkHourDao;
|
|
|
|
+ this.chuanyunWeekMemberHourDao = chuanyunWeekMemberHourDao;
|
|
|
|
+ this.chuanyunSelfCostDao = chuanyunSelfCostDao;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Scheduled(fixedDelay = 3600000L)
|
|
|
|
+ public void updateHour() {
|
|
|
|
+// dayLog();
|
|
|
|
+ standardWorkHour();
|
|
|
|
+ standardWeeklyWorkHour();
|
|
|
|
+ standardMonthlyWorkHour();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 更新最近一个月的日志信息
|
|
|
|
+ */
|
|
|
|
+ public void dayLog() {
|
|
|
|
+ var objectMapper = new ObjectMapper();
|
|
|
|
+ var start = 0;
|
|
|
|
+ var totalCount = 0L;
|
|
|
|
+ var flag = true;
|
|
|
|
+ List<String> matchersString=new ArrayList<>();
|
|
|
|
+ //由于需要统计流程中的日志,在日志数据同步时将状态为2的数据一并统计
|
|
|
|
+ matchersString.add("Status_6,[1;2;3]");
|
|
|
|
+ //获取当前时间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<ChuanyunLogDO> result = objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
|
|
|
|
+ });
|
|
|
|
+ result.forEach(chuanyunLogDO -> {
|
|
|
|
+ if(chuanyunLogDO.getDayLogList()==null||chuanyunLogDO.getDayLogList().size()==0){
|
|
|
|
+ chuanyunLogDO.setDayLogList(new ArrayList<>());
|
|
|
|
+ log.warn(chuanyunLogDO+"");
|
|
|
|
+ log.warn("异常数据");
|
|
|
|
+ }else{
|
|
|
|
+ //如果有重复就删除
|
|
|
|
+ chuanyunLogDao.findById(chuanyunLogDO.getObjectId()).ifPresent(toDelete -> {
|
|
|
|
+ chuanyunLogDao.delete(toDelete);
|
|
|
|
+ });
|
|
|
|
+ //根据projectId获取code,如果是生产项目,则不用处理
|
|
|
|
+ //针对前期测试数据,可能出现日志为空的情况,跳过不处理
|
|
|
|
+ chuanyunLogDO.getDayLogList().forEach(chuanyunDayLog -> {
|
|
|
|
+ try{
|
|
|
|
+ if(!"生产项目".equals(chuanyunDayLog.getProjectType())&& StringUtils.isEmpty(chuanyunDayLog.getProjectId())){
|
|
|
|
+ log.info(chuanyunLogDO+"");
|
|
|
|
+ }else if(!"生产项目".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());
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ //获取项目总数
|
|
|
|
+ totalCount = chuanyunFindAllResponse.getReturnData().getTotalCount();
|
|
|
|
+ //保存
|
|
|
|
+ chuanyunLogDao.saveAll(result);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error(e.getMessage());
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+// log.info(Instant.now().getEpochSecond()-startTime+"日志100条保存时间");
|
|
|
|
+ }
|
|
|
|
+ log.info("最近一月历史日志信息保存" + totalCount);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 同步最近一个月每日工时
|
|
|
|
+ */
|
|
|
|
+ public void standardWorkHour() {
|
|
|
|
+ var flag = true;
|
|
|
|
+ var pageSize = 20;
|
|
|
|
+ var page = 0;
|
|
|
|
+ long startTime=Instant.now().getEpochSecond();
|
|
|
|
+ while(flag) {
|
|
|
|
+ var pageable= PageRequest.of(page,pageSize);
|
|
|
|
+ var chuanyunUserCompanyList = chuanyunUserCompanyDao.findAllByStatus(1,pageable);
|
|
|
|
+ if (page<=chuanyunUserCompanyList.getTotalPages()){
|
|
|
|
+ page += 1;
|
|
|
|
+ //逐个将员工每天工时进行统计汇总
|
|
|
|
+ List<ChuanyunUserCompanyDO> userCompanyDOList = chuanyunUserCompanyList.getContent();
|
|
|
|
+ userCompanyDOList.forEach(chuanyunUserCompanyDO -> {
|
|
|
|
+ long start= Instant.now().getEpochSecond();
|
|
|
|
+ //工时标准化
|
|
|
|
+ standardHour(chuanyunUserCompanyDO);
|
|
|
|
+// log.info("每日工时标准化"+chuanyunUserCompanyDO.getUserName()+(Instant.now().getEpochSecond()-start)+"秒");
|
|
|
|
+ });
|
|
|
|
+ }else {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ log.info("每日工时标准化"+(Instant.now().getEpochSecond()-startTime)+"秒");
|
|
|
|
+ updateChuanyunStandardWorkHour();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 员工单日、各个项目工时标准化,并保存
|
|
|
|
+ * @param chuanyunUserCompanyDO 员工信息
|
|
|
|
+ */
|
|
|
|
+ private void standardHour(ChuanyunUserCompanyDO chuanyunUserCompanyDO) {
|
|
|
|
+ BigDecimal standard = new BigDecimal(8);
|
|
|
|
+ //每人每个项目每天工时
|
|
|
|
+ List<ChuanyunWorkHourDO> selfList = chuanyunWorkHourDao.getSelfWorkHourRecently(chuanyunUserCompanyDO.getUserId());
|
|
|
|
+ selfList.forEach(self->{
|
|
|
|
+ try{
|
|
|
|
+ ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO = new ChuanyunSelfWorkHourDO();
|
|
|
|
+ chuanyunSelfWorkHourDO.setStatus(self.getStatus());
|
|
|
|
+ chuanyunSelfWorkHourDO.setUserId(chuanyunUserCompanyDO.getUserId());
|
|
|
|
+ chuanyunSelfWorkHourDO.setProjectType(self.getProjectType());
|
|
|
|
+ if(ChuanYunConstant.PRODUCTION_PROJECT.equals(self.getProjectType())){
|
|
|
|
+ chuanyunSelfWorkHourDO.setProjectId(ChuanYunConstant.PRODUCTION_PROJECT_ID);
|
|
|
|
+ }else{
|
|
|
|
+ chuanyunSelfWorkHourDO.setProjectId(self.getProjectId());
|
|
|
|
+ }
|
|
|
|
+ chuanyunSelfWorkHourDO.setDayLogDate(self.getDayLogDate());
|
|
|
|
+ //每人每天工时
|
|
|
|
+ ChuanyunWorkHourDO chuanyunWorkHourDO = chuanyunWorkHourDao.getDayWorkHour(chuanyunUserCompanyDO.getUserId(),self.getDayLogDate());
|
|
|
|
+ //工时标准化
|
|
|
|
+ if (chuanyunWorkHourDO != null) {
|
|
|
|
+ if (chuanyunWorkHourDO.getHoursWorked().compareTo(standard)<=0) {
|
|
|
|
+ chuanyunSelfWorkHourDO.setStandardWorkHour(self.getHoursWorked());
|
|
|
|
+ }else {
|
|
|
|
+ BigDecimal personDays = (self.getHoursWorked().divide(chuanyunWorkHourDO.getHoursWorked(), 2, RoundingMode.HALF_UP)).multiply(standard);
|
|
|
|
+ chuanyunSelfWorkHourDO.setStandardWorkHour(personDays);
|
|
|
|
+ }
|
|
|
|
+ ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO1 = chuanyunSelfWorkHourDao.findByUserIdAndAndProjectIdAndAndDayLogDateAndProjectType(chuanyunUserCompanyDO.getUserId(),ChuanYunConstant.PRODUCTION_PROJECT.equals(self.getProjectType())?ChuanYunConstant.PRODUCTION_PROJECT_ID:self.getProjectId(),self.getDayLogDate(),self.getProjectType());
|
|
|
|
+ if (chuanyunSelfWorkHourDO1!=null) {
|
|
|
|
+ chuanyunSelfWorkHourDao.delete(chuanyunSelfWorkHourDO1);
|
|
|
|
+ }
|
|
|
|
+ chuanyunSelfWorkHourDao.save(chuanyunSelfWorkHourDO);
|
|
|
|
+ }
|
|
|
|
+ }catch (Exception e){
|
|
|
|
+ log.error(e.getMessage());
|
|
|
|
+ log.error(""+self);
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 定时更新氚云数据
|
|
|
|
+ */
|
|
|
|
+ private void updateChuanyunStandardWorkHour(){
|
|
|
|
+ var flag = true;
|
|
|
|
+ var pageSize = 20;
|
|
|
|
+ var page = 0;
|
|
|
|
+ log.info("开始更新日工时汇总");
|
|
|
|
+ long startTime=Instant.now().getEpochSecond();
|
|
|
|
+ while(flag) {
|
|
|
|
+ var pageable= PageRequest.of(page,pageSize);
|
|
|
|
+ var updateList=chuanyunSelfWorkHourDao.getRecentlyDayHour(pageable);
|
|
|
|
+ if (page<=updateList.getTotalPages()){
|
|
|
|
+ page += 1;
|
|
|
|
+ updateList.forEach(chuanyunSelfWorkHourDO -> {
|
|
|
|
+ try{
|
|
|
|
+ String departmentId=chuanyunUserCompanyDao.findAllByUserId(chuanyunSelfWorkHourDO.getUserId()).get(0).getDepartmentId();
|
|
|
|
+ WorkHourStatistics.ChuanyunSelfWorkHourDTO chuanyunSelfWorkHourDTO = new WorkHourStatistics.ChuanyunSelfWorkHourDTO();
|
|
|
|
+ BeanUtils.copyProperties(chuanyunSelfWorkHourDO,chuanyunSelfWorkHourDTO);
|
|
|
|
+ chuanyunSelfWorkHourDTO.setDepartmentId(departmentId);
|
|
|
|
+ List<String> matchers = new ArrayList<>();
|
|
|
|
+ matchers.add("F0000001_2,"+chuanyunSelfWorkHourDO.getProjectId());
|
|
|
|
+ matchers.add("F0000002_2,"+chuanyunSelfWorkHourDO.getUserId());
|
|
|
|
+ matchers.add("F0000003_2,"+chuanyunSelfWorkHourDO.getDayLogDate());
|
|
|
|
+ matchers.add("F0000005_2,"+chuanyunSelfWorkHourDO.getProjectType());
|
|
|
|
+// matchers.add("F0000006_2,"+self.getStatus());
|
|
|
|
+ var filter= Filter.instance(0,1,true,"And",matchers);
|
|
|
|
+ var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunMemberHourDO.SCHEMA_CODE,filter);
|
|
|
|
+ var selfMonthString=objectMapper.writeValueAsString(chuanyunSelfWorkHourDTO);
|
|
|
|
+ ChuanyunSaveDTO chuanyunSaveDTO;
|
|
|
|
+ if (chuanyunFindAllResponse.getReturnData()!=null){
|
|
|
|
+ List<ChuanyunMemberHourDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
|
|
|
|
+ ChuanyunMemberHourDO firstResult = result.get(0);
|
|
|
|
+ chuanyunSaveDTO =chuanYunManager.update(ChuanyunMemberHourDO.SCHEMA_CODE,firstResult.getObjectId(),selfMonthString);
|
|
|
|
+ }else {
|
|
|
|
+ chuanyunSaveDTO =chuanYunManager.save(ChuanyunMemberHourDO.SCHEMA_CODE,selfMonthString,true);
|
|
|
|
+ }
|
|
|
|
+ if(!chuanyunSaveDTO.getSuccessful()){
|
|
|
|
+ log.warn("新增工时标准化失败");
|
|
|
|
+ }
|
|
|
|
+ }catch (Exception e){
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ log.warn("更新标准工时异常");
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }else {
|
|
|
|
+ //流程执行完
|
|
|
|
+ flag=false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ log.info("日工时更新花费"+(Instant.now().getEpochSecond()-startTime));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 人员-项目-周度工时汇总
|
|
|
|
+ */
|
|
|
|
+ private void standardWeeklyWorkHour() {
|
|
|
|
+ long start=Instant.now().getEpochSecond();
|
|
|
|
+ //更新数据库
|
|
|
|
+ log.info("开始周工时标准化");
|
|
|
|
+ List<ChuanyunWeekMemberHourDO> list = chuanyunWeekMemberHourDao.getWeekMemberHourRecently();
|
|
|
|
+ list.forEach(chuanyunWeekMemberHourDO -> {
|
|
|
|
+ try{
|
|
|
|
+ if (chuanyunWeekMemberHourDO!=null){
|
|
|
|
+ ChuanyunWeekMemberHourDO weekMemberHourDO = new ChuanyunWeekMemberHourDO();
|
|
|
|
+ weekMemberHourDO.setProjectId(chuanyunWeekMemberHourDO.getProjectId());
|
|
|
|
+ weekMemberHourDO.setProjectType(chuanyunWeekMemberHourDO.getProjectType());
|
|
|
|
+ weekMemberHourDO.setStandardWorkHour(chuanyunWeekMemberHourDO.getStandardWorkHour());
|
|
|
|
+ weekMemberHourDO.setStatus(chuanyunWeekMemberHourDO.getStatus());
|
|
|
|
+ weekMemberHourDO.setUserId(chuanyunWeekMemberHourDO.getUserId());
|
|
|
|
+ weekMemberHourDO.setYear(chuanyunWeekMemberHourDO.getYear());
|
|
|
|
+ weekMemberHourDO.setWeek(chuanyunWeekMemberHourDO.getWeek());
|
|
|
|
+ ChuanyunWeekMemberHourDO oldWeekHour = chuanyunWeekMemberHourDao.findByProjectIdAndUserIdAndWeekAndStatusAndProjectTypeAndYear(chuanyunWeekMemberHourDO.getProjectId(),chuanyunWeekMemberHourDO.getUserId(),chuanyunWeekMemberHourDO.getWeek(),chuanyunWeekMemberHourDO.getStatus(),chuanyunWeekMemberHourDO.getProjectType(),chuanyunWeekMemberHourDO.getYear());
|
|
|
|
+ if (oldWeekHour != null) {
|
|
|
|
+ chuanyunWeekMemberHourDao.delete(oldWeekHour);
|
|
|
|
+ }
|
|
|
|
+ chuanyunWeekMemberHourDao.save(weekMemberHourDO);
|
|
|
|
+ //搜索是否还有处于审批中的数据
|
|
|
|
+ ChuanyunWeekMemberHourDO processWeekHour = chuanyunWeekMemberHourDao.getProcessWeekHour(chuanyunWeekMemberHourDO.getProjectId(),chuanyunWeekMemberHourDO.getUserId(),chuanyunWeekMemberHourDO.getYear(),chuanyunWeekMemberHourDO.getWeek(),chuanyunWeekMemberHourDO.getProjectType());
|
|
|
|
+ if (processWeekHour == null){
|
|
|
|
+ chuanyunWeekMemberHourDao.deleteByProjectIdAndUserIdAndYearAndWeekAndStatusAndProjectType(chuanyunWeekMemberHourDO.getProjectId(),chuanyunWeekMemberHourDO.getUserId(),chuanyunWeekMemberHourDO.getYear(),chuanyunWeekMemberHourDO.getWeek(),"2",chuanyunWeekMemberHourDO.getProjectType());
|
|
|
|
+ //同时删除氚云钟数据
|
|
|
|
+ deleteExamineStatus(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,"F0000007","F0000001",chuanyunWeekMemberHourDO.getProjectId(),"F0000002",chuanyunWeekMemberHourDO.getUserId(),"F0000008",chuanyunWeekMemberHourDO.getYear(),"","","F0000006",chuanyunWeekMemberHourDO.getWeek(),"F0000003",chuanyunWeekMemberHourDO.getProjectType());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }catch (Exception e){
|
|
|
|
+ log.error(e.getMessage()+"周工时标准化异常");
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ log.info("周工时标准化"+(Instant.now().getEpochSecond()-start)+"秒");
|
|
|
|
+ updateChuanyunWeekHour();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 人员-项目-周度工时汇总,更新氚云数据
|
|
|
|
+ */
|
|
|
|
+ private void updateChuanyunWeekHour(){
|
|
|
|
+ var flag = true;
|
|
|
|
+ var pageSize = 20;
|
|
|
|
+ var page = 0;
|
|
|
|
+ log.info("开始更新周工时汇总");
|
|
|
|
+ long startTime=Instant.now().getEpochSecond();
|
|
|
|
+ while(flag) {
|
|
|
|
+ var pageable = PageRequest.of(page, pageSize);
|
|
|
|
+ var updateList = chuanyunWeekMemberHourDao.getRecentlyWeekHour(pageable);
|
|
|
|
+ if (page<=updateList.getTotalPages()){
|
|
|
|
+ page += 1;
|
|
|
|
+ updateList.getContent().forEach(chuanyunWeekMemberHourDO -> {
|
|
|
|
+ //更新氚云
|
|
|
|
+ try {
|
|
|
|
+ String departmentId=chuanyunUserCompanyDao.findAllByUserId(chuanyunWeekMemberHourDO.getUserId()).get(0).getDepartmentId();
|
|
|
|
+ BigDecimal standard = new BigDecimal(8);
|
|
|
|
+ WorkHourStatistics.ChuanyunProjectMemberWeekHourDTO chuanyunProjectMemberWeekHourDTO = new WorkHourStatistics.ChuanyunProjectMemberWeekHourDTO();
|
|
|
|
+ chuanyunProjectMemberWeekHourDTO.setProjectId(chuanyunWeekMemberHourDO.getProjectId());
|
|
|
|
+ chuanyunProjectMemberWeekHourDTO.setUserId(chuanyunWeekMemberHourDO.getUserId());
|
|
|
|
+ chuanyunProjectMemberWeekHourDTO.setWeek(chuanyunWeekMemberHourDO.getWeek());
|
|
|
|
+ chuanyunProjectMemberWeekHourDTO.setProjectType(chuanyunWeekMemberHourDO.getProjectType());
|
|
|
|
+ chuanyunProjectMemberWeekHourDTO.setTotalHour(chuanyunWeekMemberHourDO.getStandardWorkHour());
|
|
|
|
+ chuanyunProjectMemberWeekHourDTO.setPersonDays(chuanyunWeekMemberHourDO.getStandardWorkHour().divide(standard,2,RoundingMode.HALF_UP));
|
|
|
|
+ chuanyunProjectMemberWeekHourDTO.setHourStatus(chuanyunWeekMemberHourDO.getStatus());
|
|
|
|
+ chuanyunProjectMemberWeekHourDTO.setYear(chuanyunWeekMemberHourDO.getYear());
|
|
|
|
+ chuanyunProjectMemberWeekHourDTO.setDepartmentId(departmentId);
|
|
|
|
+
|
|
|
|
+ List<String> matchers = new ArrayList<>();
|
|
|
|
+ matchers.add("F0000001_2,"+chuanyunWeekMemberHourDO.getProjectId());
|
|
|
|
+ matchers.add("F0000002_2,"+chuanyunWeekMemberHourDO.getUserId());
|
|
|
|
+ matchers.add("F0000006_2,"+chuanyunWeekMemberHourDO.getWeek());
|
|
|
|
+ matchers.add("F0000008_2,"+chuanyunWeekMemberHourDO.getYear());
|
|
|
|
+ matchers.add("F0000003_2,"+chuanyunWeekMemberHourDO.getProjectType());
|
|
|
|
+ matchers.add("F0000007_2,"+chuanyunWeekMemberHourDO.getStatus());
|
|
|
|
+ var filter= Filter.instance(0,1,true,"And",matchers);
|
|
|
|
+ var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,filter);
|
|
|
|
+ var selfMonthString=objectMapper.writeValueAsString(chuanyunProjectMemberWeekHourDTO);
|
|
|
|
+ ChuanyunSaveDTO chuanyunSaveDTO;
|
|
|
|
+ if (chuanyunFindAllResponse.getReturnData()!=null) {
|
|
|
|
+ List<ChuanyunProjectMemberWeekHourDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
|
|
|
|
+ ChuanyunProjectMemberWeekHourDO firstResult = result.get(0);
|
|
|
|
+ chuanyunSaveDTO = chuanYunManager.update(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,firstResult.getObjectId(),selfMonthString);
|
|
|
|
+ }else {
|
|
|
|
+ chuanyunSaveDTO = chuanYunManager.save(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,selfMonthString,true);
|
|
|
|
+ }
|
|
|
|
+ if(!chuanyunSaveDTO.getSuccessful()){
|
|
|
|
+ log.warn("新增人员项目周度工时失败");
|
|
|
|
+ }
|
|
|
|
+ } catch (JsonProcessingException | BigSizeException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }else {
|
|
|
|
+ //流程执行完
|
|
|
|
+ flag=false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ log.info("周工时更新花费"+(Instant.now().getEpochSecond()-startTime));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 单月工时汇总
|
|
|
|
+ */
|
|
|
|
+ private void standardMonthlyWorkHour() {
|
|
|
|
+ var flag = true;
|
|
|
|
+ var pageSize = 20;
|
|
|
|
+ var page = 0;
|
|
|
|
+ while(flag) {
|
|
|
|
+ var pageable= PageRequest.of(page,pageSize);
|
|
|
|
+ var chuanyunUserCompanyList = chuanyunUserCompanyDao.findAllByStatus(1,pageable);
|
|
|
|
+ if (page<=chuanyunUserCompanyList.getTotalPages()){
|
|
|
|
+ page += 1;
|
|
|
|
+ List<ChuanyunUserCompanyDO> userCompanyDOList = chuanyunUserCompanyList.getContent();
|
|
|
|
+ //单项目单人单月成本
|
|
|
|
+ userCompanyDOList.forEach(this::standardMonthlyHour);
|
|
|
|
+ }else {
|
|
|
|
+ flag = false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ updateChuanyunMonthHour();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 员工每月、各个项目标准工时会职工
|
|
|
|
+ * @param chuanyunUserCompanyDO 员工信息
|
|
|
|
+ */
|
|
|
|
+ private void standardMonthlyHour(ChuanyunUserCompanyDO chuanyunUserCompanyDO) {
|
|
|
|
+ //删除上一次状态为审核中,但本次已经审核通过的数据
|
|
|
|
+ chuanyunSelfCostDao.findAllByStatusAndUserId(ChuanYunConstant.IN_PROCESS,chuanyunUserCompanyDO.getUserId()).forEach(chuanyunSelfCostDO -> {
|
|
|
|
+ List<ChuanyunSelfWorkHourDO> chuanyunSelfWorkHourList=chuanyunSelfWorkHourDao.findAllByUserIdAndProjectIdAndProjectTypeAndStatusAndDayLogDateBetween(
|
|
|
|
+ chuanyunSelfCostDO.getUserId(),
|
|
|
|
+ chuanyunSelfCostDO.getProjectId(),
|
|
|
|
+ chuanyunSelfCostDO.getProjectType(),
|
|
|
|
+ ChuanYunConstant.IN_PROCESS,
|
|
|
|
+ chuanyunSelfCostDO.getDayLogDate(),
|
|
|
|
+ chuanyunSelfCostDO.getDayLogDate().plusMonths(1L));
|
|
|
|
+ //如果没有仍在审批中的每日工时,则将该月、该项目的审核中的月工时统计删除,manatee数据库与氚云
|
|
|
|
+ if(chuanyunSelfWorkHourList.size()==0){
|
|
|
|
+ //删除manatee中的在审核工时
|
|
|
|
+ chuanyunSelfCostDao.delete(chuanyunSelfCostDO);
|
|
|
|
+ //删除氚云中的在审核工时
|
|
|
|
+ List<String> matchers = new ArrayList<>();
|
|
|
|
+ matchers.add("F0000003_2,"+chuanyunSelfCostDO.getProjectId());
|
|
|
|
+ matchers.add("F0000009_2,"+ChuanYunConstant.IN_PROCESS);
|
|
|
|
+ matchers.add("F0000002_2,"+chuanyunSelfCostDO.getUserId());
|
|
|
|
+ matchers.add("F0000008_2,"+chuanyunSelfCostDO.getProjectType());
|
|
|
|
+ matchers.add("F0000004_2,"+chuanyunSelfCostDO.getDayLogDate());
|
|
|
|
+ var filter= Filter.instance(0,1,true,"And",matchers);
|
|
|
|
+ try {
|
|
|
|
+ ChuanyunFindAllBizDTO<Object> chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunMemberMonthCostDO.SCHEMA_CODE,filter);
|
|
|
|
+ if (chuanyunFindAllResponse.getReturnData()!=null){
|
|
|
|
+ List<ChuanyunMemberMonthCostDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
|
|
|
|
+ result.forEach(chuanyunMemberMonthCostDO -> {
|
|
|
|
+ try{
|
|
|
|
+ chuanYunManager.delete(ChuanyunMemberMonthCostDO.SCHEMA_CODE,chuanyunMemberMonthCostDO.getObjectId());
|
|
|
|
+ }catch (Exception e){
|
|
|
|
+ log.error("逐条删除失败"+e.getMessage());
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ log.error("删除已审核通过的月度数据汇总失败");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ //每月每项目工时,按月-项目-用户分组统计标准工时
|
|
|
|
+ List<ChuanyunSelfWorkHourDO> list = chuanyunSelfWorkHourDao.getMonthProjectHourRecently(chuanyunUserCompanyDO.getUserId());
|
|
|
|
+ DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
|
+ list.forEach(projectMonth->{
|
|
|
|
+ //获取人员-月度-相同工时状态标准工时汇总
|
|
|
|
+ ChuanyunSelfWorkHourDO monthHour = chuanyunSelfWorkHourDao.getMonthHour(projectMonth.getUserId(),df.format(projectMonth.getDayLogDate()),projectMonth.getStatus());
|
|
|
|
+ ChuanyunSelfCostDO chuanyunSelfCostDO = new ChuanyunSelfCostDO();
|
|
|
|
+ chuanyunSelfCostDO.setStatus(projectMonth.getStatus());
|
|
|
|
+ if (monthHour!=null){
|
|
|
|
+ chuanyunSelfCostDO.setMonthlyTotalHour(monthHour.getStandardWorkHour());
|
|
|
|
+ }
|
|
|
|
+ chuanyunSelfCostDO.setProjectId(projectMonth.getProjectId());
|
|
|
|
+ chuanyunSelfCostDO.setProjectType(projectMonth.getProjectType());
|
|
|
|
+ chuanyunSelfCostDO.setUserId(projectMonth.getUserId());
|
|
|
|
+ chuanyunSelfCostDO.setDayLogDate(projectMonth.getDayLogDate().withDayOfMonth(1));
|
|
|
|
+ chuanyunSelfCostDO.setTotalHour(projectMonth.getStandardWorkHour());
|
|
|
|
+ chuanyunSelfCostDO.setDepartmentId(chuanyunUserCompanyDO.getDepartmentId());
|
|
|
|
+ ChuanyunSelfCostDO oldSelfDO = chuanyunSelfCostDao.getOldSelfDO(chuanyunSelfCostDO.getUserId(),
|
|
|
|
+ chuanyunSelfCostDO.getProjectId(),
|
|
|
|
+ chuanyunSelfCostDO.getProjectType(),
|
|
|
|
+ df.format(chuanyunSelfCostDO.getDayLogDate()),
|
|
|
|
+ projectMonth.getStatus());
|
|
|
|
+ if (oldSelfDO !=null) {
|
|
|
|
+ chuanyunSelfCostDao.delete(oldSelfDO);
|
|
|
|
+ }
|
|
|
|
+ chuanyunSelfCostDao.save(chuanyunSelfCostDO);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 人员-项目-月度工时汇总,更新氚云数据
|
|
|
|
+ */
|
|
|
|
+ private void updateChuanyunMonthHour(){
|
|
|
|
+ var flag = true;
|
|
|
|
+ var pageSize = 20;
|
|
|
|
+ var page = 0;
|
|
|
|
+ log.info("开始更新月工时汇总");
|
|
|
|
+ long startTime=Instant.now().getEpochSecond();
|
|
|
|
+ while(flag) {
|
|
|
|
+ var pageable = PageRequest.of(page, pageSize);
|
|
|
|
+ var updateList = chuanyunSelfCostDao.getRecentlyMonthHour(pageable);
|
|
|
|
+ if (page<=updateList.getTotalPages()){
|
|
|
|
+ page += 1;
|
|
|
|
+ updateList.getContent().forEach(chuanyunSelfCostDO -> {
|
|
|
|
+ WorkHourStatistics.ChuanyunMemberMonthCostDTO chuanyunMemberMonthCostDTO = new WorkHourStatistics.ChuanyunMemberMonthCostDTO();
|
|
|
|
+ //更新氚云数据
|
|
|
|
+ chuanyunMemberMonthCostDTO.setCost(chuanyunSelfCostDO.getCost());
|
|
|
|
+ chuanyunMemberMonthCostDTO.setProjectId(chuanyunSelfCostDO.getProjectId());
|
|
|
|
+ chuanyunMemberMonthCostDTO.setProjectType(chuanyunSelfCostDO.getProjectType());
|
|
|
|
+ chuanyunMemberMonthCostDTO.setStatus(chuanyunSelfCostDO.getStatus());
|
|
|
|
+ chuanyunMemberMonthCostDTO.setUserId(chuanyunSelfCostDO.getUserId());
|
|
|
|
+ chuanyunMemberMonthCostDTO.setMonthWorkHour(chuanyunSelfCostDO.getMonthlyTotalHour());
|
|
|
|
+ chuanyunMemberMonthCostDTO.setDayLogDate(chuanyunSelfCostDO.getDayLogDate());
|
|
|
|
+ chuanyunMemberMonthCostDTO.setWorkHour(chuanyunSelfCostDO.getTotalHour());
|
|
|
|
+ chuanyunMemberMonthCostDTO.setDepartmentId(chuanyunSelfCostDO.getDepartmentId());
|
|
|
|
+ if (!StringUtils.isEmpty(chuanyunSelfCostDO.getProjectId())){
|
|
|
|
+ try {
|
|
|
|
+ List<String> matchers = new ArrayList<>();
|
|
|
|
+ matchers.add("F0000003_2,"+chuanyunSelfCostDO.getProjectId());
|
|
|
|
+ matchers.add("F0000009_2,"+chuanyunSelfCostDO.getStatus());
|
|
|
|
+ matchers.add("F0000002_2,"+chuanyunSelfCostDO.getUserId());
|
|
|
|
+ matchers.add("F0000008_2,"+chuanyunSelfCostDO.getProjectType());
|
|
|
|
+ matchers.add("F0000004_2,"+chuanyunSelfCostDO.getDayLogDate());
|
|
|
|
+ var filter= Filter.instance(0,1,true,"And",matchers);
|
|
|
|
+ var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunMemberMonthCostDO.SCHEMA_CODE,filter);
|
|
|
|
+ var memberMonthString=objectMapper.writeValueAsString(chuanyunMemberMonthCostDTO);
|
|
|
|
+ ChuanyunSaveDTO chuanyunSaveDTO;
|
|
|
|
+ if (chuanyunFindAllResponse.getReturnData()!=null){
|
|
|
|
+ List<ChuanyunMemberMonthCostDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
|
|
|
|
+ ChuanyunMemberMonthCostDO firstResult = result.get(0);
|
|
|
|
+ chuanyunSaveDTO =chuanYunManager.update(ChuanyunMemberMonthCostDO.SCHEMA_CODE,firstResult.getObjectId(),memberMonthString);
|
|
|
|
+ }else {
|
|
|
|
+ chuanyunSaveDTO =chuanYunManager.save(ChuanyunMemberMonthCostDO.SCHEMA_CODE,memberMonthString,true);
|
|
|
|
+ }
|
|
|
|
+ if(!chuanyunSaveDTO.getSuccessful()){
|
|
|
|
+ log.warn("新增项目成员月度成本汇总失败");
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ log.warn("########"+chuanyunSelfCostDO+"");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }else {
|
|
|
|
+ //流程执行完
|
|
|
|
+ flag=false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ log.info("月工时更新花费"+(Instant.now().getEpochSecond()-startTime));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 删除状态为审核中数据
|
|
|
|
+ * @param schemaCode
|
|
|
|
+ * @param
|
|
|
|
+ */
|
|
|
|
+ public void deleteExamineStatus(String schemaCode,String statusCode,String projectCode,String projectId,String userCode,String userId,String yearCode,String year,String monthCode,String month,String weekCode,String week,String typeCode,String projectType) {
|
|
|
|
+ try {
|
|
|
|
+ List<String> matchers = new ArrayList<>();
|
|
|
|
+ matchers.add(statusCode+"_2,"+"2");
|
|
|
|
+ matchers.add(projectCode+"_2,"+projectId);
|
|
|
|
+ if (!StringUtils.isEmpty(userId)){
|
|
|
|
+ matchers.add(userCode+"_2,"+userId);
|
|
|
|
+ }
|
|
|
|
+ if (!StringUtils.isEmpty(year)){
|
|
|
|
+ matchers.add(yearCode+"_2,"+year);
|
|
|
|
+ }
|
|
|
|
+ if (!StringUtils.isEmpty(month)){
|
|
|
|
+ matchers.add(monthCode+"_2,"+month);
|
|
|
|
+ }
|
|
|
|
+ if (!StringUtils.isEmpty(week)){
|
|
|
|
+ matchers.add(weekCode+"_2,"+week);
|
|
|
|
+ }
|
|
|
|
+ if (!StringUtils.isEmpty(projectType)){
|
|
|
|
+ matchers.add(typeCode+"_2,"+projectType);
|
|
|
|
+ }
|
|
|
|
+ var filter= Filter.instance(0,Integer.MAX_VALUE,true,"And",matchers);
|
|
|
|
+ var chuanyunFindAllResponse=chuanYunManager.findAll(schemaCode,filter);
|
|
|
|
+ if (chuanyunFindAllResponse.getReturnData()!=null){
|
|
|
|
+ List<ChuanyunCommonDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
|
|
|
|
+ result.forEach(basicDO -> {
|
|
|
|
+ ChuanyunSaveDTO chuanyunSaveDTO = chuanYunManager.delete(schemaCode,basicDO.getObjectId());
|
|
|
|
+ if(chuanyunSaveDTO.getSuccessful()){
|
|
|
|
+// log.info("删除状态为审核中数据成功");
|
|
|
|
+ }else{
|
|
|
|
+ log.warn("删除状态为审核中数据失败");
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ }catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ log.error(e.getMessage());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|