diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/project/result/ProjectOrgPeriodResultDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/project/result/ProjectOrgPeriodResultDTO.java index fc4867d647..caa7034481 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/project/result/ProjectOrgPeriodResultDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/project/result/ProjectOrgPeriodResultDTO.java @@ -26,17 +26,18 @@ public class ProjectOrgPeriodResultDTO implements Serializable { * */ private String projectId; + /** - * 是这个节点的操作,相当于上一个人的操作,而不是对于这个节点的处理 - * created transfer close return response + * 对这个节点的处理,如果未处理则为null + * created transfer close return response(查不出response,因为response类型的节点不会与process_staff产生关联,需要另取) * */ private String operation; /** - * 对这个节点的处理,如果未处理则为null - * created transfer close return response(查不出response,因为response类型的节点不会与process_staff产生关联,需要另取) + * 是这个节点的操作,相当于上一个人的操作,而不是对于这个节点的处理 + * created transfer close return response * */ - private String selfAction; + private String lastAction; /** * 节点所属的机关,即上个节点推到这个节点的负责部门 @@ -83,6 +84,6 @@ public class ProjectOrgPeriodResultDTO implements Serializable { /** * 第一次响应时间 * */ - private Date firstResponseDate; + private Date periodTillReplyFirstly; } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.java index 8bae057bc8..ca899b5865 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.java @@ -22,6 +22,8 @@ import com.epmet.entity.evaluationindex.extract.FactOriginProjectOrgPeriodDailyE import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** * 业务数据抽取-机关项目响应时间 * @@ -42,10 +44,19 @@ public interface FactOriginProjectOrgPeriodDailyDao extends BaseDao list); + + /** + * @Description 批量插入 + * @param list + * @return + * @author wangc + * @date 2020.09.18 17:11 + **/ + void insertBatch(@Param("list") List list); } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/ProjectExtractService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/ProjectExtractService.java index d6103f71a5..31d56460c9 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/ProjectExtractService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/ProjectExtractService.java @@ -1,7 +1,10 @@ package com.epmet.service.evaluationindex.extract; + import com.epmet.dto.extract.form.ExtractFormDTO; +import java.util.Date; + /** * @author zhaoqifeng * @dscription @@ -19,4 +22,13 @@ public interface ProjectExtractService { * @date 2020/9/15 14:38 */ void saveOriginProjectDaily(ExtractFormDTO extractFormDTO); + + /** + * @Description 抽取项目节点历时逻辑 + * @param param + * @return + * @author wangc + * @date 2020.09.17 14:05 + **/ + void extractProjectPeriodData(ExtractFormDTO param); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/impl/ProjectExtractServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/impl/ProjectExtractServiceImpl.java index cc5a4ed2ee..7450375773 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/impl/ProjectExtractServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/impl/ProjectExtractServiceImpl.java @@ -1,8 +1,10 @@ package com.epmet.service.evaluationindex.extract.impl; import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.DateUtils; import com.epmet.commons.tools.utils.Result; +import com.epmet.dao.evaluationindex.extract.FactOriginProjectOrgPeriodDailyDao; import com.epmet.dto.ProjectDTO; import com.epmet.dto.extract.FactOriginProjectMainDailyDTO; import com.epmet.dto.extract.form.ExtractFormDTO; @@ -10,10 +12,12 @@ import com.epmet.dto.form.WorkDayFormDTO; import com.epmet.dto.issue.IssueDTO; import com.epmet.dto.party.PartyMemberDTO; import com.epmet.dto.project.ProcessInfoDTO; +import com.epmet.dto.project.result.ProjectOrgPeriodResultDTO; import com.epmet.dto.result.WorkDayResultDTO; import com.epmet.dto.topic.ResiTopicDTO; import com.epmet.entity.evaluationindex.extract.FactOriginProjectLogDailyEntity; import com.epmet.entity.evaluationindex.extract.FactOriginProjectMainDailyEntity; +import com.epmet.entity.evaluationindex.extract.FactOriginProjectOrgPeriodDailyEntity; import com.epmet.entity.project.ProjectProcessEntity; import com.epmet.feign.EpmetCommonServiceOpenFeignClient; import com.epmet.service.Issue.IssueService; @@ -28,10 +32,12 @@ import com.epmet.util.DimIdGenerator; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; @@ -59,7 +65,8 @@ public class ProjectExtractServiceImpl implements ProjectExtractService { private ProjectProcessService projectProcessService; @Autowired private EpmetCommonServiceOpenFeignClient epmetCommonServiceOpenFeignClient; - + @Autowired + private FactOriginProjectOrgPeriodDailyDao factOriginProjectOrgPeriodDailyDao; @Override public void saveOriginProjectDaily(ExtractFormDTO extractFormDTO) { @@ -219,6 +226,72 @@ public class ProjectExtractServiceImpl implements ProjectExtractService { } } + /** + * @Description 抽取项目节点历时逻辑 + * @param param + * @return + * @author wangc + * @date 2020.09.17 14:05 + **/ + @Override + public void extractProjectPeriodData(ExtractFormDTO param) { + int trace = factOriginProjectOrgPeriodDailyDao.selectIfExisted(param.getCustomerId()); + Boolean isFirst = trace <= NumConstant.ZERO ? true : false; + if(StringUtils.isBlank(param.getDateId())){ + Date yesterday = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24); + SimpleDateFormat format = new SimpleDateFormat(DateUtils.DATE_PATTERN_YYYYMMDD); + param.setDateId(format.format(yesterday)); + } + List extractData = + projectProcessService.getProjectPeriod(isFirst,param.getCustomerId(),param.getDateId()); + List formattingData = new LinkedList<>(); + extractData.forEach(original -> { + FactOriginProjectOrgPeriodDailyEntity dest + = ConvertUtils.sourceToTarget(original,FactOriginProjectOrgPeriodDailyEntity.class); + if(StringUtils.isNotBlank(original.getDepartmentId())){ + dest.setOrgType("dept"); + dest.setPid(original.getOrgId()); + dest.setPids(original.getOrgIdPath()); + }else if(StringUtils.isNotBlank(original.getGridId())){ + dest.setOrgType("grid"); + dest.setPid(original.getOrgId()); + dest.setPids(original.getOrgIdPath()); + }else{ + dest.setOrgType("agency"); + dest.setPids(""); + String[] array = original.getOrgIdPath().split(":"); + if(null == array || array.length <= NumConstant.ZERO){ + dest.setPid(NumConstant.ZERO_STR); + } + if(array[NumConstant.ZERO] == original.getOrgId() && array.length == NumConstant.ONE){ + dest.setPid(NumConstant.ZERO_STR); + } + if(array.length > NumConstant.ONE && original.getOrgId() == array[array.length - NumConstant.ONE]){ + dest.setPid(array[array.length - NumConstant.TWO]); + dest.setPids(original.getOrgIdPath().replace(original.getOrgId(),"")); + } + if(StringUtils.isNotBlank(dest.getPids())){ + while(dest.getPids().endsWith(":")){ + dest.setPids(dest.getPids().substring(NumConstant.ZERO,dest.getPids().length() - NumConstant.ONE)); + } + while(dest.getPids().startsWith(":")){ + dest.setPids(dest.getPids().replaceFirst(":","")); + } + } + dest.setPids(dest.getPids().replaceAll(" ","")); + } + + formattingData.add(dest); + }); + if(!CollectionUtils.isEmpty(formattingData)) { + List projectIds = formattingData.stream().map(FactOriginProjectOrgPeriodDailyEntity::getProjectId).distinct().collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(projectIds)) { + factOriginProjectOrgPeriodDailyDao.deleteByProjectId(projectIds); + factOriginProjectOrgPeriodDailyDao.insertBatch(formattingData); + } + } + } + /** * 工作日计算 diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/impl/ProjectPeriodExtractServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/impl/ProjectPeriodExtractServiceImpl.java index f5fa2cf898..20c3e99e29 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/impl/ProjectPeriodExtractServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/impl/ProjectPeriodExtractServiceImpl.java @@ -1,16 +1,26 @@ package com.epmet.service.evaluationindex.extract.impl; import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.DateUtils; import com.epmet.dao.evaluationindex.extract.FactOriginProjectOrgPeriodDailyDao; import com.epmet.dto.extract.form.ExtractFormDTO; import com.epmet.dto.project.result.ProjectOrgPeriodResultDTO; import com.epmet.dto.project.result.ProjectOrgRelationWhenResponseResultDTO; +import com.epmet.entity.evaluationindex.extract.FactOriginProjectOrgPeriodDailyEntity; import com.epmet.service.evaluationindex.extract.ProjectPeriodExtractService; +import com.epmet.service.project.ProjectProcessService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; /** * @Description 业务数据抽取 - 项目节点历时 @@ -24,7 +34,8 @@ public class ProjectPeriodExtractServiceImpl implements ProjectPeriodExtractServ @Autowired private FactOriginProjectOrgPeriodDailyDao factOriginProjectOrgPeriodDailyDao; - + @Autowired + private ProjectProcessService projectProcessService; /** * @Description 抽取项目节点历时逻辑 @@ -37,6 +48,58 @@ public class ProjectPeriodExtractServiceImpl implements ProjectPeriodExtractServ public void extractProjectPeriodData(ExtractFormDTO param) { int trace = factOriginProjectOrgPeriodDailyDao.selectIfExisted(param.getCustomerId()); Boolean isFirst = trace <= NumConstant.ZERO ? true : false; + if(StringUtils.isBlank(param.getDateId())){ + Date yesterday = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24); + SimpleDateFormat format = new SimpleDateFormat(DateUtils.DATE_PATTERN_YYYYMMDD); + param.setDateId(format.format(yesterday)); + } + List extractData = + projectProcessService.getProjectPeriod(isFirst,param.getCustomerId(),param.getDateId()); + List formattingData = new LinkedList<>(); + extractData.forEach(original -> { + FactOriginProjectOrgPeriodDailyEntity dest + = ConvertUtils.sourceToTarget(original,FactOriginProjectOrgPeriodDailyEntity.class); + if(StringUtils.isNotBlank(original.getDepartmentId())){ + dest.setOrgType("dept"); + dest.setPid(original.getOrgId()); + dest.setPids(original.getOrgIdPath()); + }else if(StringUtils.isNotBlank(original.getGridId())){ + dest.setOrgType("grid"); + dest.setPid(original.getOrgId()); + dest.setPids(original.getOrgIdPath()); + }else{ + dest.setOrgType("agency"); + dest.setPids(""); + String[] array = original.getOrgIdPath().split(":"); + if(null == array || array.length <= NumConstant.ZERO){ + dest.setPid(NumConstant.ZERO_STR); + } + if(array[NumConstant.ZERO] == original.getOrgId() && array.length == NumConstant.ONE){ + dest.setPid(NumConstant.ZERO_STR); + } + if(array.length > NumConstant.ONE && original.getOrgId() == array[array.length - NumConstant.ONE]){ + dest.setPid(array[array.length - NumConstant.TWO]); + dest.setPids(original.getOrgIdPath().replace(original.getOrgId(),"")); + } + if(StringUtils.isNotBlank(dest.getPids())){ + while(dest.getPids().endsWith(":")){ + dest.setPids(dest.getPids().substring(NumConstant.ZERO,dest.getPids().length() - NumConstant.ONE)); + } + while(dest.getPids().startsWith(":")){ + dest.setPids(dest.getPids().replaceFirst(":","")); + } + } + dest.setPids(dest.getPids().replaceAll(" ","")); + } + formattingData.add(dest); + }); + if(!CollectionUtils.isEmpty(formattingData)) { + List projectIds = formattingData.stream().map(FactOriginProjectOrgPeriodDailyEntity::getProjectId).distinct().collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(projectIds)) { + factOriginProjectOrgPeriodDailyDao.deleteByProjectId(projectIds); + factOriginProjectOrgPeriodDailyDao.insertBatch(formattingData); + } + } } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java index fe319c224c..a78dec1da7 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java @@ -19,19 +19,22 @@ package com.epmet.service.project.impl; import com.epmet.commons.dynamic.datasource.annotation.DataSource; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.NumConstant; import com.epmet.constant.DataSourceConstant; import com.epmet.dao.project.ProjectProcessDao; +import com.epmet.dto.form.CommonStaffIdFormDTO; import com.epmet.dto.project.ProcessInfoDTO; import com.epmet.dto.project.result.ProjectOrgPeriodResultDTO; import com.epmet.dto.project.result.ProjectOrgRelationWhenResponseResultDTO; import com.epmet.entity.project.ProjectEntity; import com.epmet.entity.project.ProjectProcessEntity; import com.epmet.service.project.ProjectProcessService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -40,6 +43,7 @@ import java.util.stream.Collectors; * @author generator generator@elink-cn.com * @since v1.0.0 2020-05-11 */ +@Slf4j @Service @DataSource(DataSourceConstant.GOV_PROJECT) public class ProjectProcessServiceImpl extends BaseServiceImpl implements ProjectProcessService { @@ -93,19 +97,83 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl> processMap + = projectNodePeriodPerOrgList.stream().collect(Collectors.groupingBy(ProjectOrgPeriodResultDTO :: getProcessId)); + List projects = projectNodePeriodPerOrgList.stream().map(ProjectOrgPeriodResultDTO::getProjectId).distinct().collect(Collectors.toList()); if(!projects.isEmpty()){ List responseList = baseDao.selectResponseTrace(projects); Map> sorted = responseList.stream().collect(Collectors.groupingBy(ProjectOrgRelationWhenResponseResultDTO::getProjectId)); - + skipLevelGrouping(processMap,sorted); + List result = new LinkedList<>(); + processMap.values().forEach(list -> {list.forEach(obj -> {result.add(obj);});}); + return result; } } - return null; + return new ArrayList<>(); } + /** + * @Description 跨级分组 eg -> transfer ; response response transfer ; return ; response close. + * @param dest - Map> 需要填充的数据 + * @param fillFactor - Map> 填充因子 + * @return + * @author wangc + * @date 2020.09.18 15:27 + **/ + private void skipLevelGrouping(Map> dest,Map> fillFactor){ + for(String projectId : fillFactor.keySet()){ + List projectTraceUnit = fillFactor.get(projectId); + if(!projectTraceUnit.isEmpty()){ + Map> staffResponseTrace = + projectTraceUnit.stream().collect(Collectors.groupingBy(ProjectOrgRelationWhenResponseResultDTO::getStaffId)); + if(!CollectionUtils.isEmpty(staffResponseTrace)){ + staffResponseTrace.keySet().forEach( staffId -> { + + if(!CollectionUtils.isEmpty(staffResponseTrace.get(staffId))){ + List staffResponseTraceUnit + = staffResponseTrace.get(staffId); + int lastEndCount = NumConstant.ONE_NEG; + for(int index = NumConstant.ZERO; index < staffResponseTraceUnit.size(); index ++){ + + if(StringUtils.equalsAny(staffResponseTraceUnit.get(index).getOperation(), + "transfer","return","close")){ + + replaceFirstResponseDate(dest,index,staffResponseTraceUnit,false); + + lastEndCount = index; + }else{ + if(lastEndCount == NumConstant.ONE_NEG) continue; + + if(index - NumConstant.ONE == lastEndCount){ + replaceFirstResponseDate(dest,index,staffResponseTraceUnit,true); + }else{continue;} + } + + + + } + } + }); + } + + } + } + } - + private void replaceFirstResponseDate(Map> dest, int index, List staffResponseTraceUnit, boolean ifResponsed){ + List processSingleList = + dest.get(staffResponseTraceUnit.get(index).getProcessId()); + if(!CollectionUtils.isEmpty(processSingleList)){ + ProjectOrgPeriodResultDTO element = processSingleList.get(NumConstant.ZERO); + if(!ifResponsed && null == element.getHandledDate()){ + log.warn("com.epmet.service.project.impl.ProjectProcessServiceImpl.skipLevelGrouping::已流出节点没有办结日期,节点ID{}",element.getProcessId() ); + } + element.setPeriodTillReplyFirstly(ifResponsed ? staffResponseTraceUnit.get(index).getCreatedTime() :element.getHandledDate()); + } + } } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.xml index d1b01b9e1a..175bf983b4 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.xml @@ -37,7 +37,59 @@ DELETE FROM fact_origin_project_org_period_daily - WHERE PROJECT_ID = #{projectId} + WHERE + DEL_FLAG = '0' + + PROJECT_ID = #{item} + + + + insert into fact_origin_project_org_period_daily + ( + id, + customer_id, + project_id, + org_id, + org_type, + pid, + pids, + informed_date, + handled_date, + total_period, + period_till_reply_firstly, + is_resolved, + operation, + del_flag, + revision, + created_time, + created_by, + updated_time, + updated_by + )values + + ( + (SELECT REPLACE(UUID(), '-', '') AS id), + #{customerId}, + #{projectId}, + #{orgId}, + #{orgType}, + #{pid}, + #{pids}, + #{informedDate}, + #{handledDate}, + #{totalPeriod}, + #{periodTillReplyFirstly}, + #{isResolved}, + #{operation}, + '0', + 0, + 'CRAWLER_ROBOT', + now(), + 'CRAWLER_ROBOT', + now() + ) + + \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/project/ProjectProcessDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/project/ProjectProcessDao.xml index fd4b391fbf..480c2ccf9a 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/project/ProjectProcessDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/project/ProjectProcessDao.xml @@ -81,10 +81,11 @@