Browse Source

因为项目业务改造而需要将历史数据补充到新表的逻辑,从data-stats移动到gov-project下

master
wangchao 5 years ago
parent
commit
921c52a10b
  1. 1
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/project/result/ProjectOrgPeriodResultDTO.java
  2. 9
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java
  3. 9
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/project/ProjectProcessDao.java
  4. 5
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenDifficultyDataEntity.java
  5. 9
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/ProjectExtractService.java
  6. 28
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/ProjectExtractServiceImpl.java
  7. 11
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/ProjectProcessService.java
  8. 110
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java
  9. 1
      epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectMainDailyDao.xml
  10. 2
      epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenDifficultyDataDao.xml
  11. 36
      epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/project/ProjectProcessDao.xml
  12. 96
      epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/ProjectOrgPeriodResultDTO.java
  13. 49
      epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/ProjectOrgRelationWhenResponseResultDTO.java
  14. 5
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/ProjectController.java
  15. 9
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectDao.java
  16. 18
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectOrgRelationDao.java
  17. 10
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectProcessDao.java
  18. 12
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectStaffDao.java
  19. 11
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectProcessService.java
  20. 10
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectService.java
  21. 11
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectStaffService.java
  22. 12
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java
  23. 147
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java
  24. 7
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectStaffServiceImpl.java
  25. 100
      epmet-module/gov-project/gov-project-server/src/main/resources/db/migration/V0.0.2__period.sql
  26. 45
      epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectOrgRelationDao.xml
  27. 24
      epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectProcessDao.xml
  28. 35
      epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml

1
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/project/result/ProjectOrgPeriodResultDTO.java

@ -7,7 +7,6 @@ import java.util.Date;
/**
* @Description 从数据库中查询出的 项目 - 机关网格部门机关的响应时长
* FIXME 查询的全都是已经结案的项目如果查询流转中的项目需要修改逻辑较为复杂
* @ClassName ProjectOrgPeriodResultDTO
* @Auth wangc
* @Date 2020-09-16 15:28

9
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java

@ -744,13 +744,4 @@ public class DemoController {
return new Result();
}
@Autowired
ProjectExtractService projectExtractService;
@PostMapping("projectremould")
public Result<List<ProjectOrgPeriodResultDTO>> projectRemould(@RequestBody ExtractOriginFormDTO param){
return new Result<List<ProjectOrgPeriodResultDTO>>().ok(projectExtractService.test(param));
}
}

9
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/project/ProjectProcessDao.java

@ -154,12 +154,5 @@ public interface ProjectProcessDao extends BaseDao<ProjectProcessEntity> {
*/
List<ProjectLatestOperationResultDTO> selectLatestOperation(@Param("list") List<String> list);
/**
* @Description 批量插入节点耗时数据(数据补齐)
* @param list
* @return int
* @author wangc
* @date 2020.10.26 09:59
*/
int batchInsertProjectOrgRelation(@Param("list") List<ProjectOrgRelationDTO> list);
}

5
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenDifficultyDataEntity.java

@ -80,6 +80,11 @@ public class ScreenDifficultyDataEntity extends BaseEpmetEntity {
*/
private String eventContent;
/**
* 事件标题
*/
private String eventTitle;
/**
* 事件耗时 单位分钟
*/

9
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/ProjectExtractService.java

@ -33,5 +33,12 @@ public interface ProjectExtractService {
**/
void extractProjectPeriodData(ExtractOriginFormDTO param);
List<ProjectOrgPeriodResultDTO> test(ExtractOriginFormDTO param);
/**
* @Description 项目节点耗时数据补齐
* @param
* @return java.util.List<com.epmet.dto.project.result.ProjectOrgPeriodResultDTO>
* @author wangc
* @date 2020.10.26 10:18
*/
void projectProcessCostTimeDataCompensation();
}

28
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/ProjectExtractServiceImpl.java

@ -14,6 +14,7 @@ import com.epmet.dto.issue.IssueDTO;
import com.epmet.dto.party.PartyMemberDTO;
import com.epmet.dto.project.FinishOrgDTO;
import com.epmet.dto.project.ProcessInfoDTO;
import com.epmet.dto.project.ProjectOrgRelationDTO;
import com.epmet.dto.project.result.ProjectOrgPeriodResultDTO;
import com.epmet.dto.result.WorkDayResultDTO;
import com.epmet.dto.topic.ResiTopicDTO;
@ -29,6 +30,7 @@ import com.epmet.service.evaluationindex.extract.todata.ProjectExtractService;
import com.epmet.service.partymember.PartyMemberService;
import com.epmet.service.project.ProjectProcessService;
import com.epmet.service.project.ProjectService;
import com.epmet.service.stats.DimCustomerService;
import com.epmet.service.topic.TopicService;
import com.epmet.util.DimIdGenerator;
import lombok.extern.slf4j.Slf4j;
@ -38,10 +40,8 @@ import org.springframework.stereotype.Service;
import org.apache.commons.collections4.CollectionUtils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.*;
import java.util.stream.Collector;
import java.util.stream.Collectors;
/**
@ -71,6 +71,8 @@ public class ProjectExtractServiceImpl implements ProjectExtractService {
private EpmetCommonServiceOpenFeignClient epmetCommonServiceOpenFeignClient;
@Autowired
private FactOriginProjectOrgPeriodDailyDao factOriginProjectOrgPeriodDailyDao;
@Autowired
private DimCustomerService dimCustomerService;
private final static String ONE_DAY = "<1";
@ -444,15 +446,25 @@ public class ProjectExtractServiceImpl implements ProjectExtractService {
}
}
/**
* @Description 项目节点耗时数据补齐
* @param
* @return java.util.List<com.epmet.dto.project.result.ProjectOrgPeriodResultDTO>
* @author wangc
* @date 2020.10.26 10:18
*/
@Override
public List<ProjectOrgPeriodResultDTO> test(ExtractOriginFormDTO param) {
public void projectProcessCostTimeDataCompensation() {
List<String> customers = dimCustomerService.getAllCustomerId();
if(CollectionUtils.isEmpty(customers)) return ;
customers.forEach(local -> {
// projectProcessService.getProjectPeriod(true, local,null);
});
List<ProjectOrgPeriodResultDTO> extractData =
projectProcessService.getProjectPeriod(true, param.getCustomerId(), param.getDateId());
System.out.println("-------------EndPointHere----------------");
return extractData;
}

11
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/ProjectProcessService.java

@ -93,16 +93,7 @@ public interface ProjectProcessService extends BaseService<ProjectProcessEntity>
*/
List<ProjectProcessEntity> getClosedProjectList(String customerId, String date);
/**
* @Description 查询各机关项目节点历时
* @param isFirst 是否首次
* @param customerId
* @param date
* @return
* @author wangc
* @date 2020.09.18 13:38
**/
List<ProjectOrgPeriodResultDTO> getProjectPeriod(Boolean isFirst,String customerId,String date);
/**
* @Description 直接从项目业务改造获取项目节点耗时信息

110
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java

@ -20,11 +20,13 @@ 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.commons.tools.utils.ConvertUtils;
import com.epmet.constant.DataSourceConstant;
import com.epmet.dao.project.ProjectProcessDao;
import com.epmet.dto.form.CommonStaffIdFormDTO;
import com.epmet.dto.project.FinishOrgDTO;
import com.epmet.dto.project.ProcessInfoDTO;
import com.epmet.dto.project.ProjectOrgRelationDTO;
import com.epmet.dto.project.result.ProjectLatestOperationResultDTO;
import com.epmet.dto.project.result.ProjectOrgPeriodResultDTO;
import com.epmet.dto.project.result.ProjectOrgRelationWhenResponseResultDTO;
@ -86,45 +88,6 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessDao
return baseDao.selectClosedProjectList(customerId, date);
}
/**
* @Description 查询各机关项目节点历时
* @param isFirst 是否首次
* @param customerId
* @param date
* @return
* @author wangc
* @date 2020.09.18 13:38
**/
@Override
public List<ProjectOrgPeriodResultDTO> getProjectPeriod(Boolean isFirst,String customerId, String date) {
List<ProjectOrgPeriodResultDTO> projectNodePeriodPerOrgList;
if(isFirst){
projectNodePeriodPerOrgList = baseDao.selectProjectOrgPeriod(customerId,null,null);
}else{
projectNodePeriodPerOrgList = baseDao.selectProjectOrgPeriod(customerId,null,date);
}
if(!CollectionUtils.isEmpty(projectNodePeriodPerOrgList)){
Map<String,List<ProjectOrgPeriodResultDTO>> projectMap
= projectNodePeriodPerOrgList.stream().collect(Collectors.groupingBy(ProjectOrgPeriodResultDTO :: getProjectId));
List<String> projects =
projectNodePeriodPerOrgList.stream().map(ProjectOrgPeriodResultDTO::getProjectId).distinct().collect(Collectors.toList());
if(!projects.isEmpty()){
List<ProjectOrgRelationWhenResponseResultDTO> responseList = baseDao.selectResponseTrace(projects);
Map<String,List<ProjectOrgRelationWhenResponseResultDTO>> sorted =
responseList.stream().collect(Collectors.groupingBy(ProjectOrgRelationWhenResponseResultDTO::getProjectId));
skipLevelGrouping(projectMap,sorted);
List<ProjectOrgPeriodResultDTO> result = new LinkedList<>();
projectMap.values().forEach(list -> {list.forEach(obj -> {result.add(obj);});});
return result;
}
}
return new ArrayList<>();
}
/**
* @Description 直接从项目业务改造获取项目节点耗时信息
@ -166,75 +129,6 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessDao
}else{
return operations.stream().collect(Collectors.toMap(ProjectLatestOperationResultDTO :: getProjectId,ProjectLatestOperationResultDTO :: getOperationName));
}
}
/**
* @Description 跨级分组 eg -> transfer ; response response transfer ; return ; response close.
* @param dest - Map<String,List<ProjectOrgPeriodResultDTO>> 需要填充的数据 projectMap
* @param fillFactor - Map<String,List<ProjectOrgRelationWhenResponseResultDTO>> 填充因子
* @return
* @author wangc
* @date 2020.09.18 15:27
**/
private void skipLevelGrouping(Map<String,List<ProjectOrgPeriodResultDTO>> dest,Map<String,List<ProjectOrgRelationWhenResponseResultDTO>> fillFactor){
for(String projectId : fillFactor.keySet()){
//拿到同一个项目下的的节点记录(只有存在响应节点的项目)
List<ProjectOrgRelationWhenResponseResultDTO> projectTraceUnit = fillFactor.get(projectId);
if(!projectTraceUnit.isEmpty()){
// K : staffId
// V : 项目下对于某个员工(可能是在不同部门、网格、机关下)的所有节点顺时针操作,因为对于但项目单人来说,只能串行不能并行
Map<String,List<ProjectOrgRelationWhenResponseResultDTO>> staffResponseTrace =
projectTraceUnit.stream().collect(Collectors.groupingBy(ProjectOrgRelationWhenResponseResultDTO::getStaffId));
if(!CollectionUtils.isEmpty(staffResponseTrace)){
List<ProjectOrgPeriodResultDTO> incompleteBody = dest.get(projectId);
if(!CollectionUtils.isEmpty(incompleteBody)) {
Map<String,List<ProjectOrgPeriodResultDTO>> incompleteBodyGroupByStaffMap =
incompleteBody.stream().collect(Collectors.groupingBy(ProjectOrgPeriodResultDTO::getStaffId));
if(!CollectionUtils.isEmpty(incompleteBodyGroupByStaffMap)) {
staffResponseTrace.keySet().forEach(staffId -> {
List<ProjectOrgRelationWhenResponseResultDTO> staffResponseTraceUnit
= staffResponseTrace.get(staffId);
List<ProjectOrgPeriodResultDTO> incompleteBodyUnit = incompleteBodyGroupByStaffMap.get(staffId);
if (!CollectionUtils.isEmpty(incompleteBodyUnit) && !CollectionUtils.isEmpty(staffResponseTraceUnit)) {
//int lastEndCount = NumConstant.ONE_NEG;
a:
for (int index = NumConstant.ZERO; index < staffResponseTraceUnit.size(); index++) {
if (StringUtils.equals("response", staffResponseTraceUnit.get(index).getOperation())) {
replaceFirstResponseDate(incompleteBodyUnit,staffResponseTraceUnit.get(index));
int cursor = index;
if (cursor == staffResponseTraceUnit.size() - NumConstant.ZERO) break;
while (StringUtils.equals("response", staffResponseTraceUnit.get(cursor++).getOperation())) {
if (cursor == staffResponseTraceUnit.size() - NumConstant.ZERO) break a;
}
if (cursor == staffResponseTraceUnit.size() - NumConstant.ZERO) break;
index = cursor;
} else {
replaceFirstResponseDate(incompleteBodyUnit,staffResponseTraceUnit.get(index));
}
}
}
});
}
}
}
}
}
}
private void replaceFirstResponseDate(List<ProjectOrgPeriodResultDTO> dest,
ProjectOrgRelationWhenResponseResultDTO staffResponseTraceUnit){
// 传递过来的dest是已经按照projectId分好组之后再按照staff分组的集合
// dest key->staff
for(int cursor = 0; cursor < dest.size(); cursor++){
if(dest.get(cursor).getPeriodTillReplyFirstly() == null) continue;
dest.get(cursor).setPeriodTillReplyFirstly(staffResponseTraceUnit.getCreatedTime());
}
}
}

1
epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectMainDailyDao.xml

@ -324,6 +324,7 @@
project.GRID_ID AS orgId,
project.AGENCY_ID AS parentId,
project.TOPIC_ID AS eventImgUrl,
project.TITLE AS eventTitle,
gridInfo.allPathName AS eventSource,
gridInfo.gridName AS orgName,
project.PROJECT_STATUS AS eventStatusCode,

2
epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenDifficultyDataDao.xml

@ -135,6 +135,7 @@
EVENT_IMG_URL,
EVENT_SOURCE,
EVENT_CONTENT,
EVENT_TITLE,
EVENT_COST_TIME,
EVENT_RE_ORG,
EVENT_HANDLED_COUNT,
@ -164,6 +165,7 @@
#{item.eventImgUrl},
#{item.eventSource},
#{item.eventContent},
#{item.eventTitle},
#{item.eventCostTime},
#{item.eventReOrg},
#{item.eventHandledCount},

36
epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/project/ProjectProcessDao.xml

@ -306,40 +306,4 @@
</if>
</select>
<insert id="batchInsertProjectOrgRelation" parameterType="java.util.List">
<!-- 批量插入 -->
INSERT INTO project_org_relation(
ID,
PROJECT_STAFF_ID,
INFORMED_DATE,
CREATED_TIME,
UPDATED_TIME,
SOURCE_OPERATION,
OPERATION,
TOTAL_PERIOD,
FIRST_DEALT_DATE,
FIRST_REPLY_PERIOD,
CREATED_BY,
UPDATED_BY
) values
<foreach collection="list" item="item" index="index" separator=",">
(
(SELECT REPLACE(UUID(),'-','') as id),
#{item.projectStaffId},
#{item.informedDate},
NOW(),
NOW(),
#{item.sourceOperation},
#{item.OPERATION},
#{item.totalPeriod},
#{item.firstDealtDate},
#{item.firstReplyPeriod},
'COMPENSATION_ROBOT',
'COMPENSATION_ROBOT'
)
</foreach>
</insert>
</mapper>

96
epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/ProjectOrgPeriodResultDTO.java

@ -0,0 +1,96 @@
package com.epmet.dto.result;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @Description 从数据库中查询出的 项目 - 机关网格部门机关的响应时长
* @ClassName ProjectOrgPeriodResultDTO
* @Auth wangc
* @Date 2020-09-16 15:28
*/
@Data
public class ProjectOrgPeriodResultDTO implements Serializable {
private static final long serialVersionUID = 6216112710806237600L;
/**
* 节点Id
* */
private String processId;
/**
* 项目Id
* */
private String projectId;
/**
* 对这个节点的处理如果未处理则为null
* created transfer close return response(查不出response,因为response类型的节点不会与process_staff产生关联需要另取)
* */
private String operation;
/**
* 是这个节点的操作相当于上一个人的操作而不是对于这个节点的处理
* created transfer close return response
* */
private String lastAction;
/**
* 节点所属的机关即上个节点推到这个节点的负责部门
* */
private String departmentName;
/**
* 当前节点所属的Agency如果负责的是部门或者网格则是其所属的机关
* */
private String orgId;
/**
* 如果是部门处理则有值否则null
* */
private String departmentId;
/**
* 如果是网格处理则有值否则null
* */
private String gridId;
/**
* 当前所属的机关的所有Pid集合以及当前的机关Id所以此项不会未null至少也是它的所属Agency
* */
private String orgIdPath;
/**
* 从节点流入到节点流出且当前负责单位确实解决包括退回了的情况下所耗费的时间(以分钟为单位)
* 如果未当前负责单位一直停留在unresolved状态即使做出response或者项目被其他单位结案该项依旧是0不参与办结的计时
* 如果负责单位只是做出回应但未处理(即没有让节点流走)需要查出其相应的第一次响应时间另取
* */
private Integer totalPeriod;
/**
* 节点流入时间
* */
private Date informedDate;
/**
* 节点流出时间如果未解决则未null
* */
private Date handledDate;
/**
* 第一次响应时间
* */
private Date periodTillReplyFirstly;
private String customerId;
private String staffId;
private String isResolved;
private String projectStaffId;
}

49
epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/ProjectOrgRelationWhenResponseResultDTO.java

@ -0,0 +1,49 @@
package com.epmet.dto.result;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @Description 查询机关在项目节点上响应的结果
* 查询的是存在响应的所有相关工作人员节点如果同一个人对同一个项目已经做过一次处理并未做出响应而在第二次流转到自己时
* 做出了响应也会连带查询出其第一次未响应过的数据
* @ClassName ProjectOrgRelationWhenResponseResultDTO
* @Auth wangc
* @Date 2020-09-16 17:27
*/
@Data
public class ProjectOrgRelationWhenResponseResultDTO implements Serializable {
private static final long serialVersionUID = 1962332392048752037L;
/**
* 项目Id
* */
private String projectId;
/**
* 节点Id
* */
private String processId;
/**
* 节点动作的发起人
* */
private String staffId;
/**
* 负责人所属的单位名称:xx机关-xx部门 xx机关-xx网格 xx机关
* */
private String departmentName;
/**
* 动作分类
* */
private String operation;
/**
* 节点创建时间动作发起时间
* */
private Date createdTime;
}

5
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/ProjectController.java

@ -157,4 +157,9 @@ public class ProjectController {
return new Result();
}
@PostMapping("compensation")
public Result compensation(){
projectService.projectProcessCostTimeDataCompensation();
return new Result();
}
}

9
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectDao.java

@ -121,4 +121,13 @@ public interface ProjectDao extends BaseDao<ProjectEntity> {
* @Description 根据客户Id机关Id议题Id查询项目数据是否存在
**/
List<ProjectDTO> selectProjectList(ProjectDTO projectDTO);
/**
* @Description 得到所有的customerId
* @param
* @return java.util.List<java.lang.String>
* @author wangc
* @date 2020.10.26 11:20
*/
List<String> selectAllCustomerIds();
}

18
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectOrgRelationDao.java

@ -18,6 +18,7 @@
package com.epmet.dao;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.dto.ProjectOrgRelationDTO;
import com.epmet.entity.ProjectOrgRelationEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -69,5 +70,22 @@ public interface ProjectOrgRelationDao extends BaseDao<ProjectOrgRelationEntity>
* @date 2020.10.22 13:37
*/
List<ProjectOrgRelationEntity> selectAllUnhandledProcess(@Param("projectId")String projectId);
/**
* @Description 批量新增(数据补偿)
* @param list
* @return int
* @author wangc
* @date 2020.10.26 13:55
*/
int batchInsertProjectOrgRelation(@Param("list") List<ProjectOrgRelationDTO> list);
/**
* @Description 批量删除
* @param list
* @return int
* @author wangc
* @date 2020.10.26 14:07
*/
int deleteBatch(@Param("list") List<String> list);
}

10
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectProcessDao.java

@ -21,6 +21,7 @@ import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.dto.form.ProcessProjectIdFormDTO;
import com.epmet.dto.form.ProjectIdFormDTO;
import com.epmet.dto.result.ProcesslistResultDTO;
import com.epmet.dto.result.ProjectOrgRelationWhenResponseResultDTO;
import com.epmet.dto.result.ProjectProcessListResultDTO;
import com.epmet.entity.ProjectProcessEntity;
import org.apache.ibatis.annotations.Mapper;
@ -67,4 +68,13 @@ public interface ProjectProcessDao extends BaseDao<ProjectProcessEntity> {
* @author zxc
*/
Integer checkProjectClose(ProjectIdFormDTO projectIdFormDTO);
/**
* @Description 查询项目-机关各个节点的响应列表
* @param projects
* @return
* @author wangc
* @date 2020.09.17 17:56
**/
List<ProjectOrgRelationWhenResponseResultDTO> selectResponseTrace(@Param("projects") List<String> projects);
}

12
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectStaffDao.java

@ -108,4 +108,16 @@ public interface ProjectStaffDao extends BaseDao<ProjectStaffEntity> {
* @date 2020.10.21 15:07
*/
ProjectStaffDTO selectLatestByProjectIdAndStaffId(@Param("projectId") String projectId,@Param("staffId") String staffId);
/**
* @Description 查询项目-机关各个节点历时详情
* @param customerId
* @return
* @author wangc
* @date 2020.09.17 09:43
**/
List<com.epmet.dto.result.ProjectOrgPeriodResultDTO> selectProjectOrgPeriod(@Param("customerId") String customerId);
}

11
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectProcessService.java

@ -19,12 +19,10 @@ package com.epmet.service;
import com.epmet.commons.mybatis.service.BaseService;
import com.epmet.commons.tools.page.PageData;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.dto.ProjectProcessDTO;
import com.epmet.dto.form.*;
import com.epmet.dto.result.*;
import com.epmet.entity.ProjectProcessEntity;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
import java.util.Map;
@ -136,4 +134,13 @@ public interface ProjectProcessService extends BaseService<ProjectProcessEntity>
*/
ProjectDetailCheckResultDTO checkProjectClose(ProjectIdFormDTO projectIdFormDTO);
/**
* @Description 查询项目-机关各个节点的响应列表
* @param projects
* @return
* @author wangc
* @date 2020.09.17 17:56
**/
List<ProjectOrgRelationWhenResponseResultDTO > selectResponseTrace(List<String> projects);
}

10
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectService.java

@ -197,4 +197,14 @@ public interface ProjectService extends BaseService<ProjectEntity> {
* @return void
*/
void sendMessage(String customerId);
/**
* @Description 项目节点耗时数据补齐
* @param
* @return void
* @author wangc
* @date 2020.10.26 10:54
*/
void projectProcessCostTimeDataCompensation();
}

11
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectStaffService.java

@ -26,6 +26,7 @@ import com.epmet.dto.result.DepartmentStaffListResultDTO;
import com.epmet.dto.result.StaffUnHandledDTO;
import com.epmet.entity.ProjectStaffEntity;
import java.util.List;
import java.util.Map;
@ -169,4 +170,14 @@ public interface ProjectStaffService extends BaseService<ProjectStaffEntity> {
* @date 2020.10.21 15:07
*/
ProjectStaffDTO getLatestIdByProjectIdAndStaffId(String projectId,String staffId);
/**
* @Description 查询项目-机关各个节点历时详情
* @param customerId
* @return
* @author wangc
* @date 2020.09.17 09:43
**/
List<com.epmet.dto.result.ProjectOrgPeriodResultDTO> selectProjectOrgPeriod(String customerId);
}

12
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java

@ -399,4 +399,16 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessDao
return resultDTO;
}
/**
* @Description 查询项目-机关各个节点的响应列表
* @param projects
* @return
* @author wangc
* @date 2020.09.17 17:56
**/
@Override
public List<ProjectOrgRelationWhenResponseResultDTO> selectResponseTrace(List<String> projects) {
return baseDao.selectResponseTrace(projects);
}
}

147
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java

@ -45,6 +45,7 @@ import com.epmet.redis.ProjectRedis;
import com.epmet.service.*;
import org.apache.commons.collections4.CollectionUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@ -54,6 +55,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@ -987,6 +989,84 @@ public class ProjectServiceImpl extends BaseServiceImpl<ProjectDao, ProjectEntit
}
}
/**
* @Description 项目节点耗时数据补齐
* @param
* @return void
* @author wangc
* @date 2020.10.26 10:54
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void projectProcessCostTimeDataCompensation() {
List<String> customers = baseDao.selectAllCustomerIds();
if(CollectionUtils.isEmpty(customers))return;
List<ProjectOrgRelationDTO> totalContainer = new LinkedList<>();
customers.forEach(customerId -> {
List<ProjectOrgPeriodResultDTO> projectNodePeriodPerOrgList = projectStaffService.selectProjectOrgPeriod(customerId);
if(!org.springframework.util.CollectionUtils.isEmpty(projectNodePeriodPerOrgList)){
Map<String,List<ProjectOrgPeriodResultDTO>> projectMap
= projectNodePeriodPerOrgList.stream().collect(Collectors.groupingBy(ProjectOrgPeriodResultDTO :: getProjectId));
List<String> projects =
projectNodePeriodPerOrgList.stream().map(ProjectOrgPeriodResultDTO::getProjectId).distinct().collect(Collectors.toList());
if(!projects.isEmpty()){
List<ProjectOrgRelationWhenResponseResultDTO> responseList = projectProcessService.selectResponseTrace(projects);
Map<String,List<ProjectOrgRelationWhenResponseResultDTO>> sorted =
responseList.stream().collect(Collectors.groupingBy(ProjectOrgRelationWhenResponseResultDTO::getProjectId));
skipLevelGrouping(projectMap,sorted);
List<ProjectOrgPeriodResultDTO> calculatedData = new LinkedList<>();
projectMap.values().forEach(list -> {list.forEach(obj -> {calculatedData.add(obj);});});
if(!org.apache.commons.collections4.CollectionUtils.isEmpty(calculatedData)){
List<ProjectOrgRelationDTO> formatted = calculatedData.stream().map(period -> {
ProjectOrgRelationDTO relation = ConvertUtils.sourceToTarget(period,ProjectOrgRelationDTO.class);
relation.setFirstDealtDate(period.getPeriodTillReplyFirstly());
relation.setSourceOperation(period.getLastAction());
return relation;
}).collect(Collectors.toList());
totalContainer.addAll(formatted);
}
}
}
});
if(!CollectionUtils.isEmpty(totalContainer)){
List<String> identities = totalContainer.stream().map(ProjectOrgRelationDTO::getProjectStaffId).distinct().collect(Collectors.toList());
ListUtils.partition(identities,NumConstant.ONE_THOUSAND).forEach(partition -> {relationDao.deleteBatch(partition);});
List<TimestampIntervalFormDTO> timeInterval = totalContainer.stream().map(relation -> {
TimestampIntervalFormDTO interval = new TimestampIntervalFormDTO();
interval.setId(relation.getProjectStaffId());
interval.setLeft(relation.getInformedDate());
interval.setRight(relation.getHandledDate());
return interval;
}).collect(Collectors.toList());
Map<String,Integer> batchDelta_T = batchCalculateDelta_T(ProjectConstant.IMPRECISE_CALCULATION,
ProjectConstant.CALCULATION_TYPE_DEFAULT,timeInterval);
Map<String,ProjectOrgRelationDTO> dataMap =
totalContainer.stream().collect(Collectors.toMap(ProjectOrgRelationDTO::getProjectStaffId, Function.identity(), (key1, key2) -> key2));
if(!org.springframework.util.CollectionUtils.isEmpty(batchDelta_T) &&
!org.springframework.util.CollectionUtils.isEmpty(dataMap)){
dataMap.forEach((k,v) -> {
if(null != v){
v.setTotalPeriod(batchDelta_T.get(k));
}
});
List<List<ProjectOrgRelationDTO>> partition = ListUtils.partition(totalContainer, NumConstant.ONE_HUNDRED);
partition.forEach(subList -> {relationDao.batchInsertProjectOrgRelation(subList);});
}
}
}
private void setMessage(String customerId, List<StaffUnHandledDTO> overdueList, List<StaffUnHandledDTO> delayList, List<OverdueAndDelayDTO> list) {
list = list.stream().distinct().collect(Collectors.toList());
Map<String, List<StaffUnHandledDTO>> overdueMap = overdueList.stream().collect(Collectors.groupingBy(StaffUnHandledDTO::getStaffId));
@ -1061,4 +1141,71 @@ public class ProjectServiceImpl extends BaseServiceImpl<ProjectDao, ProjectEntit
messageFeignClient.saveUserMessageList(msgList);
}
/**
* @Description 跨级分组 eg -> transfer ; response response transfer ; return ; response close.
* @param dest - Map<String,List<ProjectOrgPeriodResultDTO>> 需要填充的数据 projectMap
* @param fillFactor - Map<String,List<ProjectOrgRelationWhenResponseResultDTO>> 填充因子
* @return
* @author wangc
* @date 2020.09.18 15:27
**/
private void skipLevelGrouping(Map<String,List<ProjectOrgPeriodResultDTO>> dest, Map<String,List<ProjectOrgRelationWhenResponseResultDTO>> fillFactor){
for(String projectId : fillFactor.keySet()){
//拿到同一个项目下的的节点记录(只有存在响应节点的项目)
List<ProjectOrgRelationWhenResponseResultDTO> projectTraceUnit = fillFactor.get(projectId);
if(!projectTraceUnit.isEmpty()){
// K : staffId
// V : 项目下对于某个员工(可能是在不同部门、网格、机关下)的所有节点顺时针操作,因为对于但项目单人来说,只能串行不能并行
Map<String,List<ProjectOrgRelationWhenResponseResultDTO>> staffResponseTrace =
projectTraceUnit.stream().collect(Collectors.groupingBy(ProjectOrgRelationWhenResponseResultDTO::getStaffId));
if(!org.springframework.util.CollectionUtils.isEmpty(staffResponseTrace)){
List<ProjectOrgPeriodResultDTO> incompleteBody = dest.get(projectId);
if(!org.springframework.util.CollectionUtils.isEmpty(incompleteBody)) {
Map<String,List<ProjectOrgPeriodResultDTO>> incompleteBodyGroupByStaffMap =
incompleteBody.stream().collect(Collectors.groupingBy(ProjectOrgPeriodResultDTO::getStaffId));
if(!org.springframework.util.CollectionUtils.isEmpty(incompleteBodyGroupByStaffMap)) {
staffResponseTrace.keySet().forEach(staffId -> {
List<ProjectOrgRelationWhenResponseResultDTO> staffResponseTraceUnit
= staffResponseTrace.get(staffId);
List<ProjectOrgPeriodResultDTO> incompleteBodyUnit = incompleteBodyGroupByStaffMap.get(staffId);
if (!org.springframework.util.CollectionUtils.isEmpty(incompleteBodyUnit) && !org.springframework.util.CollectionUtils.isEmpty(staffResponseTraceUnit)) {
//int lastEndCount = NumConstant.ONE_NEG;
a:
for (int index = NumConstant.ZERO; index < staffResponseTraceUnit.size(); index++) {
if (StringUtils.equals("response", staffResponseTraceUnit.get(index).getOperation())) {
replaceFirstResponseDate(incompleteBodyUnit,staffResponseTraceUnit.get(index));
int cursor = index;
if (cursor == staffResponseTraceUnit.size() - NumConstant.ZERO) break;
while (StringUtils.equals("response", staffResponseTraceUnit.get(cursor++).getOperation())) {
if (cursor == staffResponseTraceUnit.size() - NumConstant.ZERO) break a;
}
if (cursor == staffResponseTraceUnit.size() - NumConstant.ZERO) break;
index = cursor;
} else {
replaceFirstResponseDate(incompleteBodyUnit,staffResponseTraceUnit.get(index));
}
}
}
});
}
}
}
}
}
}
private void replaceFirstResponseDate(List<ProjectOrgPeriodResultDTO> dest,
ProjectOrgRelationWhenResponseResultDTO staffResponseTraceUnit){
// 传递过来的dest是已经按照projectId分好组之后再按照staff分组的集合
// dest key->staff
for(int cursor = 0; cursor < dest.size(); cursor++){
if(dest.get(cursor).getPeriodTillReplyFirstly() == null) continue;
dest.get(cursor).setPeriodTillReplyFirstly(staffResponseTraceUnit.getCreatedTime());
}
}
}

7
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectStaffServiceImpl.java

@ -30,6 +30,7 @@ import com.epmet.dao.ProjectStaffDao;
import com.epmet.dto.ProjectStaffDTO;
import com.epmet.dto.form.DepartmentStaffListFormDTO;
import com.epmet.dto.form.TransferOptionalStaffListFormDTO;
import com.epmet.dto.result.DepartmentResultDTO;
import com.epmet.dto.result.DepartmentStaffListResultDTO;
import com.epmet.dto.result.StaffUnHandledDTO;
@ -194,4 +195,10 @@ public class ProjectStaffServiceImpl extends BaseServiceImpl<ProjectStaffDao, Pr
return baseDao.selectLatestByProjectIdAndStaffId(projectId,staffId);
}
@Override
public List<com.epmet.dto.result.ProjectOrgPeriodResultDTO> selectProjectOrgPeriod(String customerId) {
return baseDao.selectProjectOrgPeriod(customerId);
}
}

100
epmet-module/gov-project/gov-project-server/src/main/resources/db/migration/V0.0.2__period.sql

@ -0,0 +1,100 @@
CREATE TABLE `project_org_relation` (
`ID` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`PROJECT_STAFF_ID` varchar(64) COLLATE utf8_unicode_ci NOT NULL COMMENT '关联PROJECT_STAFF,由此ID可以关联出PROJECT_ID、CUSTOMER_ID、PROCESS_ID',
`INFORMED_DATE` datetime DEFAULT NULL COMMENT '流转到的日期 同CREATED_TIME',
`HANDLED_DATE` datetime DEFAULT NULL COMMENT '流转走或结案的日期',
`TOTAL_PERIOD` int(12) DEFAULT NULL COMMENT '节点耗时,从流转到自己到流转走共耗时,单位:分钟,如果项目还没有结案且该项目在这个组织下一直滞留,这一项为空\r\n8*60的倍数',
`FIRST_DEALT_DATE` datetime DEFAULT NULL COMMENT '第一次响应时间',
`FIRST_REPLY_PERIOD` int(12) DEFAULT NULL COMMENT '首次响应时长,单位:分钟\r\n8*60的倍数',
`SOURCE_OPERATION` varchar(32) COLLATE utf8_unicode_ci NOT NULL COMMENT '来源动作,return(回退)、transfer(流转)、closed(结案)、response(响应)、created(立项时第一个流转到的)',
`OPERATION` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '处理动作,return(回退)、transfer(流转)、closed(结案)、response(响应)',
`DEL_FLAG` char(1) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0' COMMENT '删除标识',
`REVISION` int(4) NOT NULL DEFAULT '0' COMMENT '乐观锁',
`CREATED_TIME` datetime NOT NULL,
`CREATED_BY` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`UPDATED_TIME` datetime NOT NULL,
`UPDATED_BY` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='项目机关历时关系表';
ALTER TABLE `epmet_gov_project`.`project_process`
ADD COLUMN `AGENCY_ID` varchar(64) NULL COMMENT '组织ID' AFTER 'DEPARTMENT_NAME',
ADD COLUMN `DEPARTMENT_ID` varchar(64) NULL COMMENT '部门ID' AFTER 'AGENCY_ID',
ADD COLUMN `GRID_ID` varchar(64) NULL COMMENT '网格ID' AFTER 'DEPARTMENT_ID',
ADD COLUMN `ORG_ID_PATH` varchar(500) NULL COMMENT '所属机关(11:22:33)' AFTER 'GRID_ID';
ADD COLUMN `CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户Id';
UPDATE project_process a
INNER JOIN (
SELECT DISTINCT
pp.ID,
p.AGENCY_ID,
p.ORG_ID_PATH,
prp.GRID_ID
FROM
project_process pp
INNER JOIN project p ON pp.PROJECT_ID = p.ID
LEFT JOIN project_related_personnel prp ON pp.PROJECT_ID = prp.PROJECT_ID
WHERE
pp.OPERATION = 'created'
) b ON a.ID = b.ID
SET a.AGENCY_ID = b.AGENCY_ID,
a.GRID_ID = b.GRID_ID,
a.ORG_ID_PATH = b.ORG_ID_PATH;
UPDATE project_process a
INNER JOIN (
SELECT DISTINCT
pp.ID,
ps.ORG_ID,
ps.GRID_ID,
ps.DEPARTMENT_ID,
ps.ORG_ID_PATH
FROM
project_process pp
INNER JOIN project_staff ps ON pp.PROJECT_ID = ps.PROJECT_ID
AND pp.DEPARTMENT_NAME = ps.DEPARTMENT_NAME
AND ps.IS_HANDLE = 'handle'
AND pp.STAFF_ID = ps.STAFF_ID
AND ps.DEL_FLAG = '0'
WHERE
pp.OPERATION != 'created'
AND pp.OPERATION != 'response'
) b ON a.ID = b.ID
SET a.AGENCY_ID = b.ORG_ID,
a.GRID_ID = b.GRID_ID,
a.DEPARTMENT_ID = b.DEPARTMENT_ID,
a.ORG_ID_PATH = b.ORG_ID_PATH;
UPDATE project_process a
INNER JOIN (
SELECT DISTINCT
pp.ID,
ps.ORG_ID,
ps.GRID_ID,
ps.DEPARTMENT_ID,
ps.ORG_ID_PATH
FROM
project_process pp
LEFT JOIN project_staff ps ON pp.PROJECT_ID = ps.PROJECT_ID
AND pp.STAFF_ID = ps.STAFF_ID
AND pp.DEPARTMENT_NAME = ps.DEPARTMENT_NAME
WHERE
pp.OPERATION = 'response'
) b ON a.ID = b.ID
SET a.AGENCY_ID = b.ORG_ID,
a.GRID_ID = b.GRID_ID,
a.DEPARTMENT_ID = b.DEPARTMENT_ID,
a.ORG_ID_PATH = b.ORG_ID_PATH;
UPDATE PROJECT_PROCESS process
INNER JOIN PROJECT project ON process.PROJECT_ID = project.ID
AND project.DEL_FLAG = '0'
AND process.DEL_FLAG = '0'
SET process.CUSTOMER_ID = project.CUSTOMER_ID;

45
epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectOrgRelationDao.xml

@ -103,4 +103,49 @@
HANDLED_DATE IS NULL
</select>
<insert id="batchInsertProjectOrgRelation" parameterType="java.util.List">
<!-- 批量插入 -->
INSERT INTO project_org_relation(
ID,
PROJECT_STAFF_ID,
INFORMED_DATE,
CREATED_TIME,
UPDATED_TIME,
SOURCE_OPERATION,
OPERATION,
TOTAL_PERIOD,
FIRST_DEALT_DATE,
FIRST_REPLY_PERIOD,
CREATED_BY,
UPDATED_BY
) values
<foreach collection="list" item="item" index="index" separator=",">
(
(SELECT REPLACE(UUID(),'-','') as id),
#{item.projectStaffId},
#{item.informedDate},
NOW(),
NOW(),
#{item.sourceOperation},
#{item.OPERATION},
#{item.totalPeriod},
#{item.firstDealtDate},
#{item.firstReplyPeriod},
'COMPENSATION_ROBOT',
'COMPENSATION_ROBOT'
)
</foreach>
</insert>
<delete id="deleteBatch">
DELETE
project_org_relation
WHERE
<foreach collection="list" item="projectStaffId" open="" separator=" OR " close="">
PROJECT_STAFF_ID = #{projectStaffId}
</foreach>
</delete>
</mapper>

24
epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectProcessDao.xml

@ -60,4 +60,28 @@
AND project_id = #{projectId}
</select>
<!-- 查询项目-机关各个节点的响应列表 -->
<select id="selectResponseTrace" resultType="com.epmet.dto.result.ProjectOrgRelationWhenResponseResultDTO">
SELECT
process.PROJECT_ID,
process.ID AS PROCESS_ID,
process.STAFF_ID,
process.DEPARTMENT_NAME,
process.OPERATION,
process.CREATED_TIME
FROM
PROJECT_PROCESS process
WHERE
process.DEL_FLAG = '0'
AND
<foreach collection="projects" item="id" open="(" close=")" separator=" OR ">
process.PROJECT_ID = #{id}
</foreach>
AND
EXISTS(
SELECT * FROM PROJECT_PROCESS WHERE DEL_FLAG = '0' AND PROJECT_ID = process.PROJECT_ID AND OPERATION = 'response'
AND STAFF_ID = process.STAFF_ID AND DEPARTMENT_NAME = process.DEPARTMENT_NAME
)
ORDER BY process.PROJECT_ID , process.STAFF_ID , process.CREATED_TIME ASC
</select>
</mapper>

35
epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml

@ -140,4 +140,39 @@
LIMIT 1
</select>
<!-- 查询项目-机关各个节点历时详情 -->
<select id="selectProjectOrgPeriod" resultType="com.epmet.dto.result.ProjectOrgPeriodResultDTO">
SELECT
staff.ID AS projectStaffId,
project.CUSTOMER_ID,
process.ID AS processId,
process.PROJECT_ID,
process.OPERATION AS lastAction,
IF(staff.IS_HANDLE='handle',selfAction.OPERATION,null) AS operation,
staff.DEPARTMENT_NAME,
staff.ORG_ID,
staff.DEPARTMENT_ID,
staff.GRID_ID,
staff.STAFF_ID AS staffId,
staff.ORG_ID_PATH,
IF(staff.IS_HANDLE='handle',timestampdiff(MINUTE , staff.CREATED_TIME , staff.UPDATED_TIME),0) AS TOTAL_PERIOD,
staff.CREATED_TIME AS informedDate,
IF(staff.IS_HANDLE='handle','resolved','unresolved') AS isResolved,
IF(staff.IS_HANDLE='handle',staff.UPDATED_TIME,null) AS handledDate,
IF(staff.IS_HANDLE='handle',staff.UPDATED_TIME,null) AS periodTillReplyFirstly
FROM PROJECT_STAFF staff
LEFT JOIN PROJECT project ON staff.PROJECT_ID = project.ID AND project.DEL_FLAG = '0'
LEFT JOIN PROJECT_PROCESS process ON staff.PROCESS_ID = process.ID AND process.DEL_FLAG = '0'
LEFT JOIN PROJECT_PROCESS selfAction ON staff.PROJECT_ID = selfAction.PROJECT_ID AND selfAction.DEL_FLAG = '0'
AND ABS(TIMESTAMPDIFF(SECOND,staff.UPDATED_TIME,selfAction.CREATED_TIME)) <![CDATA[ <= ]]> 30
AND staff.STAFF_ID = selfAction.STAFF_ID
WHERE staff.DEL_FLAG = '0'
AND project.CUSTOMER_ID = #{customerId}
AND process.OPERATION <![CDATA[ <> ]]> 'response'
ORDER BY process.PROJECT_ID,staff.CREATED_TIME ASC
</select>
</mapper>
Loading…
Cancel
Save