Browse Source

Merge remote-tracking branch 'origin/dev_difficulty_data' into dev_temp

# Conflicts:
#	epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/project/ProjectController.java
#	epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/project/ProjectService.java
#	epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/project/impl/ProjectServiceImpl.java
#	epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/EpmetCommonServiceOpenFeignClient.java
#	epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/fallback/EpmetCommonServiceOpenFeignClientFallback.java
#	epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectProcessService.java
#	epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java
dev_shibei_match
wangchao 5 years ago
parent
commit
b74d86536c
  1. 3
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java
  2. 3
      epmet-gateway/pom.xml
  3. 41
      epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/form/DifficultyRankFormDTO.java
  4. 59
      epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/result/ProjectDifficultRankResultDTO.java
  5. 34
      epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/result/ProjectNextAgencyResultDTO.java
  6. 5
      epmet-module/data-report/data-report-server/pom.xml
  7. 35
      epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/project/ProjectController.java
  8. 19
      epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/project/ProjectDao.java
  9. 22
      epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/project/ProjectService.java
  10. 108
      epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/project/impl/ProjectServiceImpl.java
  11. 35
      epmet-module/data-report/data-report-server/src/main/resources/mapper/project/ProjectDao.xml
  12. 114
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/project/ProjectOrgRelationDTO.java
  13. 3
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/project/result/ProjectOrgPeriodResultDTO.java
  14. 2
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java
  15. 2
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.java
  16. 22
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/project/ProjectProcessDao.java
  17. 5
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenDifficultyDataEntity.java
  18. 12
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/ProjectExtractService.java
  19. 33
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/ProjectExtractServiceImpl.java
  20. 14
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/ProjectProcessService.java
  21. 100
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java
  22. 1
      epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectMainDailyDao.xml
  23. 2
      epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenDifficultyDataDao.xml
  24. 73
      epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/project/ProjectProcessDao.xml
  25. 35
      epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/form/CostDayFormDTO.java
  26. 41
      epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/form/TimestampIntervalFormDTO.java
  27. 47
      epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/form/WorkMinuteFormDTO.java
  28. 37
      epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/result/CostDayResultDTO.java
  29. 34
      epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/EpmetCommonServiceOpenFeignClient.java
  30. 35
      epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/fallback/EpmetCommonServiceOpenFeignClientFallback.java
  31. 29
      epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/constant/ProjectConstant.java
  32. 44
      epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/controller/WorkDayController.java
  33. 32
      epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/WorkDayService.java
  34. 347
      epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/impl/WorkDayServiceImpl.java
  35. 1
      epmet-module/epmet-common-service/common-service-server/src/main/resources/mapper/CalenderDao.xml
  36. 5
      epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/SubAgencyFormDTO.java
  37. 4
      epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/SubListResultDTO.java
  38. 9
      epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java
  39. 5
      epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java
  40. 1
      epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/AgencyController.java
  41. 2
      epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerAgencyDao.java
  42. 6
      epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/AgencyServiceImpl.java
  43. 4
      epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml
  44. 113
      epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/ProjectOrgRelationDTO.java
  45. 20
      epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/ProjectProcessDTO.java
  46. 28
      epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/OverdueAndDelayDTO.java
  47. 96
      epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/ProjectOrgPeriodResultDTO.java
  48. 49
      epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/ProjectOrgRelationWhenResponseResultDTO.java
  49. 41
      epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/StaffUnHandledDTO.java
  50. 6
      epmet-module/gov-project/gov-project-server/pom.xml
  51. 30
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/ParameterKeyConstant.java
  52. 20
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/ProjectConstant.java
  53. 31
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/UserMessageConstant.java
  54. 10
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/ProjectController.java
  55. 13
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/CustomerProjectParameterDao.java
  56. 9
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectDao.java
  57. 91
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectOrgRelationDao.java
  58. 10
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectProcessDao.java
  59. 41
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectStaffDao.java
  60. 83
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/ProjectOrgRelationEntity.java
  61. 25
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/ProjectProcessEntity.java
  62. 9
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/CustomerProjectParameterService.java
  63. 10
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectProcessService.java
  64. 19
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectService.java
  65. 40
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectStaffService.java
  66. 13
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/CustomerProjectParameterServiceImpl.java
  67. 71
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java
  68. 520
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java
  69. 46
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectStaffServiceImpl.java
  70. 100
      epmet-module/gov-project/gov-project-server/src/main/resources/db/migration/V0.0.2__period.sql
  71. 9
      epmet-module/gov-project/gov-project-server/src/main/resources/mapper/CustomerProjectParameterDao.xml
  72. 151
      epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectOrgRelationDao.xml
  73. 24
      epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectProcessDao.xml
  74. 109
      epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml

3
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java

@ -26,10 +26,11 @@ public interface NumConstant {
int TEN = 10;
int ELEVEN = 11;
int TWELVE = 12;
int SEVENTEEN = 17;
int FIFTEEN = 15;
int FOURTEEN=14;
int TWENTY = 20;
int TWENTY_FOUR = 24;
int THIRTY = 30;
int THIRTY_ONE = 31;
int FORTY = 40;

3
epmet-gateway/pom.xml

@ -288,10 +288,11 @@
<!-- <gateway.routes.gov-issue-server.uri>http://localhost:8101</gateway.routes.gov-issue-server.uri>-->
<gateway.routes.gov-issue-server.uri>lb://gov-issue-server</gateway.routes.gov-issue-server.uri>
<!-- 23、政府工作端项目管理 -->
<!-- <gateway.routes.gov-project-server.uri>http://localhost:8102</gateway.routes.gov-project-server.uri>-->
<!-- <gateway.routes.gov-project-server.uri>http://localhost:8102</gateway.routes.gov-project-server.uri>-->
<gateway.routes.gov-project-server.uri>lb://gov-project-server</gateway.routes.gov-project-server.uri>
<!-- 24、公共服务 -->
<gateway.routes.common-service-server.uri>lb://common-service-server</gateway.routes.common-service-server.uri>
<!-- <gateway.routes.common-service-server.uri>http://localhost:8103</gateway.routes.common-service-server.uri>-->
<!-- 25、党建园地 -->
<gateway.routes.resi-home-server.uri>lb://resi-home-server</gateway.routes.resi-home-server.uri>
<!-- <gateway.routes.resi-home-server.uri>http://localhost:8104</gateway.routes.resi-home-server.uri>-->

41
epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/form/DifficultyRankFormDTO.java

@ -0,0 +1,41 @@
package com.epmet.project.dto.form;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 数据改版-难点堵点项目排行--接口入参
* @Author jiangyy
*/
@Data
public class DifficultyRankFormDTO implements Serializable {
private static final long serialVersionUID = -2880432640584616651L;
public interface DifficultyRankInternalGroup {}
/**
* 组织Id
*/
@NotBlank(message = "组织ID不能为空",groups = {DifficultyRankInternalGroup.class})
private String agencyId;
/**
* 状态: 待处理: pending; 结案closed
*/
private String status;
/**
* 排序类型 耗时最长timelongest涉及部门最多mostdepts处理次数mosthandled
*/
@NotBlank(message = "排序类型不能为空",groups = {DifficultyRankInternalGroup.class})
private String type;
/**
* 获取数据个数 默认前10
*/
private Integer topNum = 10;
/**
* 查询的组织类型 网格grid 组织agency
*/
@NotBlank(message = "查询的组织类型不能为空",groups = {DifficultyRankInternalGroup.class})
private String orgType;
}

59
epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/result/ProjectDifficultRankResultDTO.java

@ -0,0 +1,59 @@
package com.epmet.project.dto.result;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* @Description 难点赌点-耗时最长|涉及部门最多|处理次数 返参DTO
* @NEI https://nei.netease.com/interface/detail/res/?pid=57068&id=321614
* @ClassName DifficultProjectResultDTO
* @Auth jiangyy
* @Date 2020-08-20 13:43
*/
@Data
public class ProjectDifficultRankResultDTO implements Serializable {
private static final long serialVersionUID = -7338625142484943434L;
/**
* 项目id
* */
private String projectId;
/**
* 项目标题
* */
private String title;
/**
* 状态: 待处理: pending; 结案closed
* */
private String statusCode;
/**
* 社区-网格名
* */
private String gridName;
/**
* 图片列表
* */
private List<String> imgUrlList;
/**
* 耗时单位分钟
* */
private Integer totalHours;
/**
* 涉及多少个部门
* */
private Integer reOrg;
/**
* 处理次数
* */
private Integer handledCount;
}

34
epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/result/ProjectNextAgencyResultDTO.java

@ -0,0 +1,34 @@
package com.epmet.project.dto.result;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @Description 难点赌点-当前登录人员本级一级下一级组织机构/网格 返参DTO
* @NEI https://nei.netease.com/interface/detail/res/?pid=57068&id=321614
* @ClassName DifficultProjectResultDTO
* @Auth jiangyy
* @Date 2020-08-20 13:43
*/
@Data
public class ProjectNextAgencyResultDTO implements Serializable {
private static final long serialVersionUID = -7338625142484943434L;
/**
* 组织id
* */
private String orgId;
/**
* 组织名称
* */
private String orgName;
/**
* 网格grid 组织agency
* */
private String orgType;
}

5
epmet-module/data-report/data-report-server/pom.xml

@ -13,6 +13,11 @@
<modelVersion>4.0.0</modelVersion>
<dependencies>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>gov-org-client</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>data-report-client</artifactId>

35
epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/project/ProjectController.java

@ -1,13 +1,15 @@
package com.epmet.module.project.controller;
package com.epmet.datareport.controller.project;
import com.epmet.commons.tools.annotation.LoginUser;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.validator.ValidatorUtils;
import com.epmet.datareport.service.project.ProjectService;
import com.epmet.dto.form.ProcessListFormDTO;
import com.epmet.module.project.service.ProjectService;
import com.epmet.project.constant.ProjectConstant;
import com.epmet.project.dto.form.DifficultyRankFormDTO;
import com.epmet.project.dto.form.ProjectIncrTrendFormDTO;
import com.epmet.project.dto.result.*;
import org.springframework.beans.factory.annotation.Autowired;
@ -41,7 +43,7 @@ public class ProjectController {
/**
* @Author sun
* @Description 数据-项目-获取组织下饼图数据
* @Description t
**/
@PostMapping("summaryinfo")
public Result<List<ProjectSummaryInfoResultDTO>> summaryInfo(@LoginUser TokenDto tokenDto) {
@ -79,6 +81,35 @@ public class ProjectController {
return new Result<List<ProjectIncrTrendResultDTO>>().ok(projectService.getProjectIncrTrend(tokenDto, formDTO));
}
/**
* @Description 难点赌点-耗时最长|涉及部门最多|处理次数
* @NEI https://nei.netease.com/interface/detail/res/?pid=57068&id=321614
* @param param
* @return
* @author jiangyy
* @date 2020.10.19 16:38
**/
@PostMapping("difficultyrank")
public Result<List<ProjectDifficultRankResultDTO>> difficultyRank(@RequestBody DifficultyRankFormDTO param){
ValidatorUtils.validateEntity(param, DifficultyRankFormDTO.DifficultyRankInternalGroup.class);
return new Result<List<ProjectDifficultRankResultDTO>>().ok(projectService.getDifficultyRank(param));
}
/**
* @Description 难点赌点-耗时最长|涉及部门最多|处理次数
* @NEI https://nei.netease.com/interface/detail/res/?pid=57068&id=321614
* @param tokenDto
* @return
* @author jiangyy
* @date 2020.10.19 16:38
**/
@PostMapping("mynextagency")
public Result<List<ProjectNextAgencyResultDTO>> myNextAgency(@LoginUser TokenDto tokenDto){
return new Result<List<ProjectNextAgencyResultDTO>>().ok(projectService.getMyNextAgency(tokenDto));
}
/**
* @Description 项目详情
* @Param processListFormDTO

19
epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/project/ProjectDao.java

@ -1,6 +1,7 @@
package com.epmet.datareport.dao.project;
import com.epmet.project.dto.FactAgencyProjectDailyDTO;
import com.epmet.project.dto.form.DifficultyRankFormDTO;
import com.epmet.project.dto.result.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -55,4 +56,22 @@ public interface ProjectDao {
* @Description 查询机关月统计近十二个月数据
**/
List<ProjectIncrTrendResultDTO> selectIncrTrendMonthly(@Param("agencyId") String agencyId);
/**
* @Description 查询难点赌点-耗时最长|涉及部门最多|处理次数
* @param
* @return
* @author jiangyy
* @date 2020.10.19 16:38
**/
List<ProjectDifficultRankResultDTO> difficultyRank(DifficultyRankFormDTO difficultyRankFormDTO);
/**
* @Description 查询难点堵点的图片list
* @param
* @return
* @author jiangyy
* @date 2020.10.20 10:13
**/
List<String> getDifficultyImgList(String eventId);
}

22
epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/project/ProjectService.java

@ -1,6 +1,7 @@
package com.epmet.module.project.service;
package com.epmet.datareport.service.project;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.project.dto.form.DifficultyRankFormDTO;
import com.epmet.dto.form.ProcessListFormDTO;
import com.epmet.project.dto.form.ProjectIncrTrendFormDTO;
import com.epmet.project.dto.result.*;
@ -43,6 +44,25 @@ public interface ProjectService {
**/
List<ProjectIncrTrendResultDTO> getProjectIncrTrend(TokenDto tokenDto, ProjectIncrTrendFormDTO formDTO);
/**
* @Description 难点赌点-耗时最长|涉及部门最多|处理次数
* @NEI https://nei.netease.com/interface/detail/res/?pid=57068&id=321614
* @param param
* @return
* @author jiangyy
* @date 2020.10.19 16:38
**/
List<ProjectDifficultRankResultDTO> getDifficultyRank(DifficultyRankFormDTO param);
/**
* @Description 难点赌点-获取组织下拉框
* @NEI https://nei.netease.com/interface/detail/res/?pid=57068&id=321614
* @return
* @author jiangyy
* @date 2020.10.19 16:38
**/
List<ProjectNextAgencyResultDTO> getMyNextAgency(TokenDto tokenDto);
/**
* @Description 项目详情
* @Param processListFormDTO

108
epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/project/impl/ProjectServiceImpl.java

@ -1,23 +1,34 @@
package com.epmet.datareport.service.project.impl;
import com.epmet.commons.dynamic.datasource.annotation.DataSource;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.utils.DateUtils;
import com.epmet.commons.tools.utils.Result;
import com.epmet.constant.DataSourceConstant;
import com.epmet.commons.tools.utils.Result;
import com.epmet.datareport.dao.project.ProjectDao;
import com.epmet.dto.CustomerAgencyDTO;
import com.epmet.datareport.service.evaluationindex.screen.ScreenDifficultyDataService;
import com.epmet.dto.form.LoginUserDetailsFormDTO;
import com.epmet.dto.form.SubAgencyFormDTO;
import com.epmet.dto.result.GridByStaffResultDTO;
import com.epmet.dto.form.ProcessListFormDTO;
import com.epmet.dto.result.LoginUserDetailsResultDTO;
import com.epmet.dto.result.SubAgencyResultDTO;
import com.epmet.dto.result.SubListResultDTO;
import com.epmet.dto.result.ProcessAndCurrentDeptResultDTO;
import com.epmet.dto.result.ProcesslistResultDTO;
import com.epmet.feign.EpmetUserOpenFeignClient;
import com.epmet.feign.GovOrgOpenFeignClient;
import com.epmet.datareport.service.project.ProjectService;
import com.epmet.feign.GovProjectOpenFeignClient;
import com.epmet.module.project.service.ProjectService;
import com.epmet.project.constant.ProjectConstant;
import com.epmet.project.dto.FactAgencyProjectDailyDTO;
import com.epmet.project.dto.form.DifficultyRankFormDTO;
import com.epmet.project.dto.form.ProjectIncrTrendFormDTO;
import com.epmet.project.dto.result.*;
import org.springframework.beans.BeanUtils;
@ -47,6 +58,9 @@ public class ProjectServiceImpl implements ProjectService {
@Autowired
private ScreenDifficultyDataService screenDifficultyDataService;
@Autowired
private GovOrgOpenFeignClient govOrgOpenFeignClient;
/**
* @Author sun
* @Description 数据-项目-获取汇总数据
@ -218,4 +232,98 @@ public class ProjectServiceImpl implements ProjectService {
return agencyId;
}
/**
* @author jiangyy
* @Description 获取userId
*/
private String getLoginUserUserId(TokenDto tokenDto) {
LoginUserDetailsFormDTO dto = new LoginUserDetailsFormDTO();
BeanUtils.copyProperties(tokenDto, dto);
LoginUserDetailsResultDTO data = epmetUserOpenFeignClient.getLoginUserDetails(dto).getData();
String userId = data.getUserId();
if (null == userId || "".equals(userId)) {
throw new RenException(ProjectConstant.GET_AGENCYID);
}
return userId;
}
/**
* @Description 难点赌点-获取组织下拉框
* @NEI https://nei.netease.com/interface/detail/res/?pid=57068&id=321614
* @return
* @author jiangyy
* @date 2020.10.19 16:38
**/
@Override
public List<ProjectNextAgencyResultDTO> getMyNextAgency(TokenDto tokenDto) {
List<ProjectNextAgencyResultDTO> resultList = new ArrayList<>();
//1、根据token获取本级agencyId、获取userId
String agencyId = getLoginUserDetails(tokenDto);
String userId=getLoginUserUserId(tokenDto);
//2、获取本级组织机构
Result<CustomerAgencyDTO> customerAgencyDTO = govOrgOpenFeignClient.getAgencyById(agencyId);
ProjectNextAgencyResultDTO angencyDto = new ProjectNextAgencyResultDTO();
angencyDto.setOrgId(agencyId);
angencyDto.setOrgName(customerAgencyDTO.getData().getOrganizationName());
angencyDto.setOrgType(customerAgencyDTO.getData().getLevel());
resultList.add(angencyDto);
//3、获取下一级组织机构\网格
if( customerAgencyDTO.getData().getLevel() == "community" ){
//取下级网格
Result<List<GridByStaffResultDTO>> gridListResult = govOrgOpenFeignClient.listGridsbystaffid(userId);
List<GridByStaffResultDTO> gridList = gridListResult.getData();
for(int i=0;i<gridList.size();i++){
ProjectNextAgencyResultDTO subAgencyDto = new ProjectNextAgencyResultDTO();
subAgencyDto.setOrgId(agencyId);
subAgencyDto.setOrgName(customerAgencyDTO.getData().getOrganizationName());
subAgencyDto.setOrgType(customerAgencyDTO.getData().getLevel());
resultList.add(subAgencyDto);
}
} else {
//取下级组织机构
SubAgencyFormDTO form = new SubAgencyFormDTO();
form.setAgencyId(agencyId);
form.setAgencyNum(100);
Result<SubAgencyResultDTO> SubAgencyResultDTO = govOrgOpenFeignClient.subAgencyList(form);
List<SubListResultDTO> subAgencyList = SubAgencyResultDTO.getData().getAgencyList();
for(int i=0;i<subAgencyList.size();i++){
ProjectNextAgencyResultDTO subAgencyDto = new ProjectNextAgencyResultDTO();
subAgencyDto.setOrgId(subAgencyList.get(i).getAgencyId());
subAgencyDto.setOrgName(subAgencyList.get(i).getAgencyName());
subAgencyDto.setOrgType(subAgencyList.get(i).getAgencyLevel());
resultList.add(subAgencyDto);
}
}
if(null == resultList) return new ArrayList<>();
return resultList;
}
/**
* @Description 难点赌点-耗时最长|涉及部门最多|处理次数
* @NEI https://nei.netease.com/interface/detail/res/?pid=57068&id=321614
* @param param
* @return
* @author jiangyy
* @date 2020.10.19 16:38
**/
@DataSource(value = DataSourceConstant.EVALUATION_INDEX,datasourceNameFromArg = true)
@Override
public List<ProjectDifficultRankResultDTO> getDifficultyRank(DifficultyRankFormDTO param) {
List<ProjectDifficultRankResultDTO> result = projectDao.difficultyRank(param);
for (int i = 0; i < result.size (); i ++){
List<String> imgUrlList ;
imgUrlList = projectDao.getDifficultyImgList(result.get(i).getProjectId()) ;
result.get(i).setImgUrlList(imgUrlList);
}
if(null == result) return new ArrayList<>();
return result;
}
}

35
epmet-module/data-report/data-report-server/src/main/resources/mapper/project/ProjectDao.xml

@ -234,4 +234,39 @@
)a ORDER BY a.month_id DESC,a.type ASC
</select>
<!-- 查询难点赌点-耗时最长|涉及部门最多|处理次数 -->
<select id="difficultyRank" resultType="com.epmet.project.dto.result.ProjectDifficultRankResultDTO">
SELECT
diff.EVENT_ID AS projectId,
diff.EVENT_CONTENT AS title,
diff.EVENT_STATUS_CODE AS statusCode,
diff.EVENT_SOURCE AS gridName,
diff.EVENT_IMG_URL AS imgUrl,
ROUND(diff.EVENT_COST_TIME/60,0) AS totalHours,
diff.EVENT_RE_ORG AS reOrg,
diff.EVENT_HANDLED_COUNT AS handledCount
FROM
screen_difficulty_data diff
WHERE
diff.DEL_FLAG = '0'
AND diff.ORG_ID = #{agencyId}
<if test="status!= null">
AND diff.EVENT_STATUS_CODE = #{status}
</if>
AND diff.ORG_TYPE = #{orgType}
ORDER BY
CASE #{type} WHEN 'timelongest' THEN diff.EVENT_COST_TIME
WHEN 'mosthandled' THEN diff.EVENT_HANDLED_COUNT
ELSE diff.EVENT_RE_ORG END
DESC LIMIT #{topNum}
</select>
<!-- 查询难点赌点-耗时最长|涉及部门最多|处理次数 -->
<select id="getDifficultyImgList" resultType="string">
select EVENT_IMG_URL
FROM
screen_difficulty_img_data
WHERE EVENT_ID = #{eventId}
ORDER BY SORT
</select>
</mapper>

114
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/project/ProjectOrgRelationDTO.java

@ -0,0 +1,114 @@
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.epmet.dto.project;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 项目机关历时关系表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2020-10-19
*/
@Data
public class ProjectOrgRelationDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
*/
private String id;
/**
* 关联PROJECT_STAFF由此ID可以关联出PROJECT_IDCUSTOMER_IDPROCESS_ID
*/
private String projectStaffId;
/**
* 流转到的日期 同CREATED_TIME
*/
private Date informedDate;
/**
* 流转走或结案的日期
*/
private Date handledDate;
/**
* 节点耗时从流转到自己到流转走共耗时单位分钟如果项目还没有结案且该项目在这个组织下一直滞留这一项为空
* 8*60的倍数
*/
private Integer totalPeriod;
/**
* 第一次响应时间
*/
private Date firstDealtDate;
/**
* 首次响应时长单位分钟
* 8*60的倍数
*/
private Integer firstReplyPeriod;
/**
* 来源动作return(回退)transfer(流转)closed(结案)response(响应)created(立项时第一个流转到的)
*/
private String sourceOperation;
/**
* 处理动作return(回退)transfer(流转)closed(结案)response(响应)
*/
private String operation;
/**
* 删除标识
*/
private String delFlag;
/**
* 乐观锁
*/
private Integer revision;
/**
*
*/
private Date createdTime;
/**
*
*/
private String createdBy;
/**
*
*/
private Date updatedTime;
/**
*
*/
private String updatedBy;
}

3
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
@ -92,4 +91,6 @@ public class ProjectOrgPeriodResultDTO implements Serializable {
private String isResolved;
private String projectStaffId;
}

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

@ -21,6 +21,7 @@ import com.epmet.dto.AgencySubTreeDto;
import com.epmet.dto.extract.form.ExtractOriginFormDTO;
import com.epmet.dto.extract.form.ExtractScreenFormDTO;
import com.epmet.dto.indexcal.CalculateCommonFormDTO;
import com.epmet.dto.project.result.ProjectOrgPeriodResultDTO;
import com.epmet.dto.stats.form.CustomerIdAndDateIdFormDTO;
import com.epmet.entity.evaluationindex.indexcoll.FactIndexGovrnAblityGridMonthlyEntity;
import com.epmet.entity.evaluationindex.indexcoll.FactIndexPartyAblityGridMonthlyEntity;
@ -36,6 +37,7 @@ import com.epmet.service.StatsDemoService;
import com.epmet.service.evaluationindex.extract.dataToIndex.*;
import com.epmet.service.evaluationindex.extract.todata.FactOriginProjectLogDailyService;
import com.epmet.service.evaluationindex.extract.todata.FactOriginTopicMainDailyService;
import com.epmet.service.evaluationindex.extract.todata.ProjectExtractService;
import com.epmet.service.evaluationindex.extract.toscreen.*;
import com.epmet.service.evaluationindex.indexcal.*;
import com.epmet.service.stats.DimAgencyService;

2
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.java

@ -47,7 +47,7 @@ public interface FactOriginProjectOrgPeriodDailyDao extends BaseDao<FactOriginPr
/**
* @Description 在插入之前先删除所有与这个项目相关的历时信息
* @param list
* @param projectId
* @return
* @author wangc
* @date 2020.09.17 14:43

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

@ -20,6 +20,7 @@ package com.epmet.dao.project;
import com.epmet.commons.mybatis.dao.BaseDao;
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;
@ -28,6 +29,7 @@ import com.epmet.entity.project.ProjectProcessEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
@ -106,6 +108,15 @@ public interface ProjectProcessDao extends BaseDao<ProjectProcessEntity> {
**/
List<ProjectOrgPeriodResultDTO> selectProjectOrgPeriod(@Param("customerId") String customerId,@Param("projectStatus")String projectStatus,@Param("dateId") String dateId);
/**
* @Description 根据项目业务改造在数据抽取时直接查询出项目节点的耗时
* @param
* @return java.util.List<com.epmet.dto.project.result.ProjectOrgPeriodResultDTO>
* @author wangc
* @date 2020.10.23 11:13
*/
List<ProjectOrgPeriodResultDTO> selectProjectOrgPeriodDirectly(@Param("customerId") String customerId,@Param("projectStatus")String projectStatus,@Param("dateId") String dateId);
/**
* @Description 查询项目-机关各个节点的响应列表
* @param projects
@ -115,6 +126,15 @@ public interface ProjectProcessDao extends BaseDao<ProjectProcessEntity> {
**/
List<ProjectOrgRelationWhenResponseResultDTO> selectResponseTrace(@Param("projects") List<String> projects);
/**
* @Description 查询项目的节点
* @param projects
* @return java.util.List<com.epmet.dto.project.result.ProjectOrgRelationWhenResponseResultDTO>
* @author wangc
* @date 2020.10.23 17:02
*/
List<ProjectOrgRelationWhenResponseResultDTO> selectProjectProcess(@Param("projects") List<String> projects);
/**
* 获取办结组织
* @author zhaoqifeng
@ -133,4 +153,6 @@ public interface ProjectProcessDao extends BaseDao<ProjectProcessEntity> {
* @date 2020.09.28 14:45
*/
List<ProjectLatestOperationResultDTO> selectLatestOperation(@Param("list") List<String> 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;
/**
* 事件耗时 单位分钟
*/

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

@ -2,6 +2,9 @@ package com.epmet.service.evaluationindex.extract.todata;
import com.epmet.dto.extract.form.ExtractOriginFormDTO;
import com.epmet.dto.project.result.ProjectOrgPeriodResultDTO;
import java.util.List;
/**
* @author zhaoqifeng
@ -29,4 +32,13 @@ public interface ProjectExtractService {
* @date 2020.09.17 14:05
**/
void extractProjectPeriodData(ExtractOriginFormDTO param);
/**
* @Description 项目节点耗时数据补齐
* @param
* @return java.util.List<com.epmet.dto.project.result.ProjectOrgPeriodResultDTO>
* @author wangc
* @date 2020.10.26 10:18
*/
void projectProcessCostTimeDataCompensation();
}

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

@ -16,6 +16,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;
@ -31,6 +32,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;
@ -40,10 +42,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
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;
/**
@ -73,6 +73,8 @@ public class ProjectExtractServiceImpl implements ProjectExtractService {
private EpmetCommonServiceOpenFeignClient epmetCommonServiceOpenFeignClient;
@Autowired
private FactOriginProjectOrgPeriodDailyDao factOriginProjectOrgPeriodDailyDao;
@Autowired
private DimCustomerService dimCustomerService;
private final static String ONE_DAY = "<1";
@ -398,7 +400,7 @@ public class ProjectExtractServiceImpl implements ProjectExtractService {
param.setDateId(DateUtils.getBeforeNDay(NumConstant.ONE));
}
List<ProjectOrgPeriodResultDTO> extractData =
projectProcessService.getProjectPeriod(isFirst, param.getCustomerId(), param.getDateId());
projectProcessService.getProjectPeriodDirectly(isFirst, param.getCustomerId(), param.getDateId());
List<FactOriginProjectOrgPeriodDailyEntity> formattingData = new LinkedList<>();
extractData.forEach(original -> {
FactOriginProjectOrgPeriodDailyEntity dest
@ -447,6 +449,27 @@ 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 void projectProcessCostTimeDataCompensation() {
List<String> customers = dimCustomerService.getAllCustomerId();
if(CollectionUtils.isEmpty(customers)) return ;
customers.forEach(local -> {
// projectProcessService.getProjectPeriod(true, local,null);
});
System.out.println("-------------EndPointHere----------------");
}
/**
* 工作日计算

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

@ -93,16 +93,18 @@ public interface ProjectProcessService extends BaseService<ProjectProcessEntity>
*/
List<ProjectProcessEntity> getClosedProjectList(String customerId, String date);
/**
* @Description 查询各机关项目节点历时
* @param isFirst 是否首次
* @Description 直接从项目业务改造获取项目节点耗时信息
* @param isFirst
* @param customerId
* @param date
* @return
* @return java.util.List<com.epmet.dto.project.result.ProjectOrgPeriodResultDTO>
* @author wangc
* @date 2020.09.18 13:38
**/
List<ProjectOrgPeriodResultDTO> getProjectPeriod(Boolean isFirst,String customerId,String date);
* @date 2020.10.23 09:10
*/
List<ProjectOrgPeriodResultDTO> getProjectPeriodDirectly(Boolean isFirst,String customerId, String date);
/**
* 获取办结组织

100
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,43 +88,24 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessDao
return baseDao.selectClosedProjectList(customerId, date);
}
/**
* @Description 查询各机关项目节点历时
* @param isFirst 是否首次
* @Description 直接从项目业务改造获取项目节点耗时信息
* @param isFirst
* @param customerId
* @param date
* @return
* @return java.util.List<com.epmet.dto.project.result.ProjectOrgPeriodResultDTO>
* @author wangc
* @date 2020.09.18 13:38
**/
* @date 2020.10.23 09:10
*/
@Override
public List<ProjectOrgPeriodResultDTO> getProjectPeriod(Boolean isFirst,String customerId, String date) {
List<ProjectOrgPeriodResultDTO> projectNodePeriodPerOrgList;
public List<ProjectOrgPeriodResultDTO> getProjectPeriodDirectly(Boolean isFirst, String customerId, String date) {
if(isFirst){
projectNodePeriodPerOrgList = baseDao.selectProjectOrgPeriod(customerId,null,null);
return baseDao.selectProjectOrgPeriodDirectly(customerId,null,null);
}else{
projectNodePeriodPerOrgList = baseDao.selectProjectOrgPeriod(customerId,null,date);
return baseDao.selectProjectOrgPeriodDirectly(customerId,null,date);
}
if(!CollectionUtils.isEmpty(projectNodePeriodPerOrgList)){
Map<String,List<ProjectOrgPeriodResultDTO>> processMap
= projectNodePeriodPerOrgList.stream().collect(Collectors.groupingBy(ProjectOrgPeriodResultDTO :: getProcessId));
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(processMap,sorted);
List<ProjectOrgPeriodResultDTO> result = new LinkedList<>();
processMap.values().forEach(list -> {list.forEach(obj -> {result.add(obj);});});
return result;
}
}
return new ArrayList<>();
}
@Override
@ -146,67 +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>> 需要填充的数据
* @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()){
Map<String,List<ProjectOrgRelationWhenResponseResultDTO>> staffResponseTrace =
projectTraceUnit.stream().collect(Collectors.groupingBy(ProjectOrgRelationWhenResponseResultDTO::getStaffId));
if(!CollectionUtils.isEmpty(staffResponseTrace)){
staffResponseTrace.keySet().forEach( staffId -> {
if(!CollectionUtils.isEmpty(staffResponseTrace.get(staffId))){
List<ProjectOrgRelationWhenResponseResultDTO> 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,true);
lastEndCount = index;
}else{
if(lastEndCount == NumConstant.ONE_NEG) continue;
if(index - NumConstant.ONE == lastEndCount){
replaceFirstResponseDate(dest,index,staffResponseTraceUnit,false);
}else{continue;}
}
}
}
});
}
}
}
}
private void replaceFirstResponseDate(Map<String,List<ProjectOrgPeriodResultDTO>> dest, int index, List<ProjectOrgRelationWhenResponseResultDTO> staffResponseTraceUnit, boolean ifResponsed){
List<ProjectOrgPeriodResultDTO> processSingleList =
dest.get(staffResponseTraceUnit.get(index).getProcessId());
if(!CollectionUtils.isEmpty(processSingleList)){
//ProjectOrgPeriodResultDTO element = processSingleList.get(NumConstant.ZERO);
ProjectOrgPeriodResultDTO element = processSingleList.stream().filter(node ->
StringUtils.equals(node.getStaffId(),staffResponseTraceUnit.get(index).getStaffId())).findFirst().get();
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());
}
}
}

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

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

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

@ -98,6 +98,7 @@
<!-- 查询项目-机关各个节点历时详情 -->
<select id="selectProjectOrgPeriod" resultType="com.epmet.dto.project.result.ProjectOrgPeriodResultDTO">
SELECT
staff.ID AS projectStaffId,
project.CUSTOMER_ID,
process.ID AS processId,
process.PROJECT_ID,
@ -107,7 +108,7 @@
staff.ORG_ID,
staff.DEPARTMENT_ID,
staff.GRID_ID,
staff.CREATED_BY AS staffId,
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,
@ -119,7 +120,9 @@
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 staff.UPDATED_TIME = selfAction.CREATED_TIME AND staff.STAFF_ID = selfAction.STAFF_ID
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}
@ -137,6 +140,45 @@
ORDER BY process.PROJECT_ID,staff.CREATED_TIME ASC
</select>
<select id="selectProjectOrgPeriodDirectly" resultType="com.epmet.dto.project.result.ProjectOrgPeriodResultDTO">
SELECT
staff.CUSTOMER_ID,
staff.PROCESS_ID,
staff.PROJECT_ID,
relation.SOURCE_OPERATION AS lastAction,
relation.OPERATION,
staff.DEPARTMENT_NAME,
staff.ORG_ID,
staff.DEPARTMENT_ID,
staff.GRID_ID,
staff.ORG_ID_PATH,
staff.STAFF_ID,
relation.TOTAL_PERIOD,
relation.INFORMED_DATE,
IF(staff.IS_HANDLE='handle','resolved','unresolved') AS isResolved,
relation.HANDLED_DATE,
relation.FIRST_DEALT_DATE AS periodTillReplyFirstly
FROM PROJECT_STAFF staff
INNER JOIN PROJECT_ORG_RELATION relation ON staff.ID = relation.PROJECT_STAFF_ID AND relation.DEL_FLAG = '0'
WHERE staff.DEL_FLAG = '0'
AND staff.CUSTOMER_ID = #{customerId}
<if test='null != projectStatus and "" != projectStatus'>
AND project.STATUS = #{projectStatus}
</if>
<if test='null != dateId and "" != dateId'>
AND (
DATE_FORMAT(relation.UPDATED_TIME , '%Y%m%d') = #{dateId}
)
</if>
ORDER BY staff.PROJECT_ID,staff.CREATED_TIME ASC
</select>
<!-- 查询项目-机关各个节点的响应列表 -->
<select id="selectResponseTrace" resultType="com.epmet.dto.project.result.ProjectOrgRelationWhenResponseResultDTO">
SELECT
@ -159,8 +201,32 @@
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.STAFF_ID , process.CREATED_TIME ASC
ORDER BY process.PROJECT_ID , process.STAFF_ID , process.CREATED_TIME ASC
</select>
<!-- 查询项目的节点 -->
<select id="selectProjectProcess" resultType="com.epmet.dto.project.result.ProjectOrgRelationWhenResponseResultDTO">
SELECT
ID AS processId,
PROJECT_ID,
STAFF_ID,
OPERATION,
CREATED_TIME
FROM
PROJECT_PROCESS
WHERE
DEL_FLAG = '0'
AND
PROJECT_ID
IN(
SELECT DISTINCT ID
)
<foreach collection="projects" item="id" open="AND (" close=")" separator=" OR ">
PROJECT_ID = #{id}
</foreach>
ORDER BY PROJECT_ID,STAFF_ID,CREATED_TIME ASC
</select>
<select id="selectFinishOrg" resultType="com.epmet.dto.project.FinishOrgDTO">
SELECT
a.GRID_ID,
@ -239,4 +305,5 @@
AND DATE_FORMAT(pp.CREATED_TIME,'%Y%m%d') = #{date}
</if>
</select>
</mapper>

35
epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/form/CostDayFormDTO.java

@ -0,0 +1,35 @@
package com.epmet.dto.form;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author zhaoqifeng
* @dscription
* @date 2020/10/21 17:34
*/
@Data
public class CostDayFormDTO implements Serializable {
private static final long serialVersionUID = -1002961480112906533L;
/**
* 项目ID
*/
private String id;
/**
* 工作人员ID
*/
private String staffId;
/**
* 起始日期
*/
private Date startDate;
/**
* 终止日期
*/
private Date endDate;
}

41
epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/form/TimestampIntervalFormDTO.java

@ -0,0 +1,41 @@
package com.epmet.dto.form;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;
/**
* @Description 时间区间
* @ClassName TimestampIntervalFormDTO
* @Auth wangc
* @Date 2020-10-21 15:55
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TimestampIntervalFormDTO implements Serializable {
private static final long serialVersionUID = 8404199047657424778L;
/***
* 可以是任意的标志Id用来区分多组传参的返回值
*/
@NotNull(message = "时间区间标识Id不能为空",groups = WorkMinuteFormDTO.WorkTimeGroup.class)
private String id;
/**
* 区间左段点
*/
@NotNull(message = "开始时间不能为空",groups = WorkMinuteFormDTO.WorkTimeGroup.class)
private Date left;
/***
* 去边右段点
*/
private Date right;
}

47
epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/form/WorkMinuteFormDTO.java

@ -0,0 +1,47 @@
package com.epmet.dto.form;
import com.epmet.commons.tools.validator.group.CustomerClientShowGroup;
import lombok.Data;
import javax.validation.Valid;
import java.io.Serializable;
import java.util.List;
/**
* @Description 计算经历的多少分钟(只计算工作日)
* @ClassName WorkMinuteFromDTO
* @Auth wangc
* @Date 2020-10-21 15:48
*/
@Data
public class WorkMinuteFormDTO implements Serializable {
private static final long serialVersionUID = -7777345488803895645L;
public interface WorkTimeGroup extends CustomerClientShowGroup{}
/**
* 是否使用自定义起止时间 default - 24小时制计 custom - 使用自定义但是一定要传递起止时间(目前只支持在同一天)
*/
private String ifCustom;
/**
* 是否精准计算 默认不精准计算 Imprecise - 不精准 precise - 精准
*/
private String ifPrecise;
/***
* 每天的计算起始时间
* HH:mm:ss
*/
private String startTemplate;
/***
* 每天的计算截止时间
* HH:mm:ss
*/
private String endTemplate;
@Valid
private List<TimestampIntervalFormDTO> timeList;
}

37
epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/result/CostDayResultDTO.java

@ -0,0 +1,37 @@
package com.epmet.dto.result;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author zhaoqifeng
* @dscription
* @date 2020/10/21 17:53
*/
@Data
public class CostDayResultDTO implements Serializable {
private static final long serialVersionUID = -1575208332115510050L;
/**
* 项目ID
*/
private String id;
/**
* 工作人员ID
*/
private String staffId;
/**
* 已滞留工作日
*/
private Integer detentionDays;
/**
* 起始日期
*/
private Date startDate;
}

34
epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/EpmetCommonServiceOpenFeignClient.java

@ -2,9 +2,12 @@ package com.epmet.feign;
import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.utils.Result;
import com.epmet.dto.form.CostDayFormDTO;
import com.epmet.dto.form.ExternalAppAuthFormDTO;
import com.epmet.dto.form.GetJwtAccessTokenFormDTO;
import com.epmet.dto.form.WorkDayFormDTO;
import com.epmet.dto.result.CostDayResultDTO;
import com.epmet.dto.form.WorkMinuteFormDTO;
import com.epmet.dto.result.AppIdInfoResultDTO;
import com.epmet.dto.result.ExternalAppAuthResultDTO;
import com.epmet.dto.result.WorkDayResultDTO;
@ -14,6 +17,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
import java.util.Map;
/**
* 本服务对外开放的API,其他服务通过引用此client调用该服务
@ -56,6 +60,36 @@ public interface EpmetCommonServiceOpenFeignClient {
@PostMapping("/commonservice/externalapp/get-secret")
Result getSecret(@RequestBody String appId);
/**
* 工作日计算
* @author zhaoqifeng
* @date 2020/10/22 9:25
* @param formDTO
* @return com.epmet.commons.tools.utils.Result<java.util.List<com.epmet.dto.result.CostDayResultDTO>>
*/
@PostMapping("commonservice/workday/workdays")
Result<List<CostDayResultDTO>> costWorkDays(@RequestBody List<CostDayFormDTO> formDTO);
/**
* 日历天计算
* @author zhaoqifeng
* @date 2020/10/22 9:25
* @param formDTO
* @return com.epmet.commons.tools.utils.Result<java.util.List<com.epmet.dto.result.CostDayResultDTO>>
*/
@PostMapping("commonservice/workday/calendardays")
Result<List<CostDayResultDTO>> costCalendarDays(@RequestBody List<CostDayFormDTO> formDTO);
/**
* @Description 计算经历的多少分钟(只计算工作日)
* @param param
* @return com.epmet.commons.tools.utils.Result<java.util.Map<java.lang.String,java.lang.Integer>>
* @author wangc
* @date 2020.10.21 16:34
*/
@PostMapping("commonservice/workday/workminutes")
Result<Map<String,Integer>> workMinutes(@RequestBody WorkMinuteFormDTO param);
/**
* @Description 获取AccessToken
* @return Result

35
epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/fallback/EpmetCommonServiceOpenFeignClientFallback.java

@ -3,16 +3,20 @@ package com.epmet.feign.fallback;
import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.utils.ModuleUtils;
import com.epmet.commons.tools.utils.Result;
import com.epmet.dto.form.CostDayFormDTO;
import com.epmet.dto.form.ExternalAppAuthFormDTO;
import com.epmet.dto.form.GetJwtAccessTokenFormDTO;
import com.epmet.dto.form.WorkDayFormDTO;
import com.epmet.dto.result.AppIdInfoResultDTO;
import com.epmet.dto.form.WorkMinuteFormDTO;
import com.epmet.dto.result.CostDayResultDTO;
import com.epmet.dto.result.ExternalAppAuthResultDTO;
import com.epmet.dto.result.WorkDayResultDTO;
import com.epmet.feign.EpmetCommonServiceOpenFeignClient;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
/**
* 本服务对外开放的API,其他服务通过引用此client调用该服务
@ -42,6 +46,37 @@ public class EpmetCommonServiceOpenFeignClientFallback implements EpmetCommonSer
return ModuleUtils.feignConError(ServiceConstant.EPMET_COMMON_SERVICE, "getSecret", appId);
}
/**
* 工作日计算
*
* @param formDTO
* @return com.epmet.commons.tools.utils.Result<java.util.List < com.epmet.dto.result.CostDayResultDTO>>
* @author zhaoqifeng
* @date 2020/10/22 9:25
*/
@Override
public Result<List<CostDayResultDTO>> costWorkDays(List<CostDayFormDTO> formDTO) {
return ModuleUtils.feignConError(ServiceConstant.EPMET_COMMON_SERVICE, "costWorkDays", formDTO);
}
/**
* 日历天计算
*
* @param formDTO
* @return com.epmet.commons.tools.utils.Result<java.util.List < com.epmet.dto.result.CostDayResultDTO>>
* @author zhaoqifeng
* @date 2020/10/22 9:25
*/
@Override
public Result<List<CostDayResultDTO>> costCalendarDays(List<CostDayFormDTO> formDTO) {
return ModuleUtils.feignConError(ServiceConstant.EPMET_COMMON_SERVICE, "costCalendarDays", formDTO);
}
@Override
public Result<Map<String, Integer>> workMinutes(WorkMinuteFormDTO param) {
return ModuleUtils.feignConError(ServiceConstant.EPMET_COMMON_SERVICE, "workMinutes", param);
}
@Override
public Result<AppIdInfoResultDTO> appIdInfo(String appId) {
return ModuleUtils.feignConError(ServiceConstant.EPMET_COMMON_SERVICE, "appIdInfo", appId);

29
epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/constant/ProjectConstant.java

@ -8,4 +8,33 @@ public interface ProjectConstant {
* 时间已存在
*/
/**
* 日期类型 工作日
*/
String DAY_TYPE_WORK = "1";
/**
* 日期类型 周末
*/
String DAY_TYPE_WEEKEND = "2";
/**
* 日期类型 假日
*/
String DAY_TYPE_HOLIDAY = "3";
/***
* 计算方式 使用自定应
*/
String CALCULATION_TYPE_CUSTOM = "custom";
/**
* 计算方式 使用默认24小时制
*/
String CALCULATION_TYPE_DEFAULT = "default";
/**
* 精准计算
*/
String PRECISE_CALCULATION = "precise";
}

44
epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/controller/WorkDayController.java

@ -1,7 +1,10 @@
package com.epmet.controller;
import com.epmet.commons.tools.utils.Result;
import com.epmet.dto.form.CostDayFormDTO;
import com.epmet.dto.form.WorkDayFormDTO;
import com.epmet.dto.result.CostDayResultDTO;
import com.epmet.dto.form.WorkMinuteFormDTO;
import com.epmet.dto.result.WorkDayResultDTO;
import com.epmet.service.WorkDayService;
import org.springframework.beans.factory.annotation.Autowired;
@ -11,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
/**
* @Description 工作日计算
@ -36,5 +40,45 @@ public class WorkDayController {
List<WorkDayResultDTO> list = workDayService.detentionDays(formDTO);
return new Result<List<WorkDayResultDTO>>().ok(list);
}
/**
* 工作日计算
* @author zhaoqifeng
* @date 2020/10/22 9:23
* @param formDTO
* @return com.epmet.commons.tools.utils.Result<java.util.List<com.epmet.dto.result.CostDayResultDTO>>
*/
@PostMapping("workdays")
public Result<List<CostDayResultDTO>> costWorkDays(@RequestBody List<CostDayFormDTO> formDTO) {
List<CostDayResultDTO> list = workDayService.costWorkDays(formDTO);
return new Result<List<CostDayResultDTO>>().ok(list);
}
/**
* 日历天计算
* @author zhaoqifeng
* @date 2020/10/22 9:23
* @param formDTO
* @return com.epmet.commons.tools.utils.Result<java.util.List<com.epmet.dto.result.CostDayResultDTO>>
*/
@PostMapping("calendardays")
public Result<List<CostDayResultDTO>> costCalendarDays(@RequestBody List<CostDayFormDTO> formDTO) {
List<CostDayResultDTO> list = workDayService.costCalendarDays(formDTO);
return new Result<List<CostDayResultDTO>>().ok(list);
}
/**
* @Description 计算经历的多少分钟(只计算工作日)
* @param param
* @return com.epmet.commons.tools.utils.Result<java.util.Map<java.lang.String,java.lang.Integer>>
* @author wangc
* @date 2020.10.21 16:34
*/
@PostMapping("workminutes")
public Result<Map<String,Integer>> workMinutes(@RequestBody WorkMinuteFormDTO param){
return new Result<Map<String,Integer>>().ok(workDayService.workMinutes(param));
}
}

32
epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/WorkDayService.java

@ -1,9 +1,14 @@
package com.epmet.service;
import com.epmet.dto.form.CostDayFormDTO;
import com.epmet.dto.form.WorkDayFormDTO;
import com.epmet.dto.result.CostDayResultDTO;
import com.epmet.dto.form.WorkMinuteFormDTO;
import com.epmet.dto.result.WorkDayResultDTO;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
@ -13,4 +18,31 @@ import java.util.Set;
*/
public interface WorkDayService {
List<WorkDayResultDTO> detentionDays(List<WorkDayFormDTO> formDTO);
/**
* 工作日计算
* @author zhaoqifeng
* @date 2020/10/21 17:56
* @param formDTO
* @return java.util.List<com.epmet.dto.result.CostDayResultDTO>
*/
List<CostDayResultDTO> costWorkDays(List<CostDayFormDTO> formDTO);
/**
* 日历日计算
* @author zhaoqifeng
* @date 2020/10/21 17:56
* @param formDTO
* @return java.util.List<com.epmet.dto.result.CostDayResultDTO>
*/
List<CostDayResultDTO> costCalendarDays(List<CostDayFormDTO> formDTO);
/**
* @Description 计算经历的多少分钟(只计算工作日)
* @param param
* @return java.util.Map<java.lang.String,java.lang.Integer>
* @author wangc
* @date 2020.10.21 16:14
*/
Map<String,Integer> workMinutes(WorkMinuteFormDTO param);
}

347
epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/impl/WorkDayServiceImpl.java

@ -1,17 +1,30 @@
package com.epmet.service.impl;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.utils.DateUtils;
import com.epmet.commons.tools.utils.DateUtils;
import com.epmet.constant.ProjectConstant;
import com.epmet.dao.CalenderDao;
import com.epmet.dto.form.CostDayFormDTO;
import com.epmet.dto.form.TimestampIntervalFormDTO;
import com.epmet.dto.form.WorkDayFormDTO;
import com.epmet.dto.result.CostDayResultDTO;
import com.epmet.dto.form.WorkMinuteFormDTO;
import com.epmet.dto.result.WorkDayResultDTO;
import com.epmet.entity.CalenderEntity;
import com.epmet.service.WorkDayService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.*;
/**
@ -25,6 +38,8 @@ public class WorkDayServiceImpl implements WorkDayService {
@Autowired
private CalenderDao calenderDao;
private static SimpleDateFormat format = new SimpleDateFormat(DateUtils.DATE_PATTERN);
private static SimpleDateFormat formatMinute = new SimpleDateFormat(DateUtils.DATE_TIME_PATTERN);
@Override
public List<WorkDayResultDTO> detentionDays(List<WorkDayFormDTO> workDayFormDTO) {
List<WorkDayResultDTO> list = new ArrayList<>();
@ -44,6 +59,95 @@ public class WorkDayServiceImpl implements WorkDayService {
return list;
}
/**
* 工作日计算
*
* @param formDTO
* @return java.util.List<com.epmet.dto.result.CostDayResultDTO>
* @author zhaoqifeng
* @date 2020/10/21 17:56
*/
@Override
public List<CostDayResultDTO> costWorkDays(List<CostDayFormDTO> formDTO) {
List<CostDayResultDTO> list = new ArrayList<>();
if (formDTO.isEmpty()) {
throw new RenException("起始时间、终止时间不能为空");
}
for (CostDayFormDTO form : formDTO) {
CostDayResultDTO result = new CostDayResultDTO();
result.setId(form.getId());
result.setStaffId(form.getStaffId());
result.setDetentionDays(this.getWorkDays(form.getStartDate(), form.getEndDate()));
result.setStartDate(form.getStartDate());
list.add(result);
}
return list;
}
/**
* 日历日计算
*
* @param formDTO
* @return java.util.List<com.epmet.dto.result.CostDayResultDTO>
* @author zhaoqifeng
* @date 2020/10/21 17:56
*/
@Override
public List<CostDayResultDTO> costCalendarDays(List<CostDayFormDTO> formDTO) {
List<CostDayResultDTO> list = new ArrayList<>();
if (formDTO.isEmpty()) {
throw new RenException("起始时间、终止时间不能为空");
}
for (CostDayFormDTO form : formDTO) {
CostDayResultDTO result = new CostDayResultDTO();
result.setId(form.getId());
result.setStaffId(form.getStaffId());
result.setDetentionDays(this.getCalendarDays(form.getStartDate(), form.getEndDate()));
result.setStartDate(form.getStartDate());
list.add(result);
}
return list;
}
/**
* @Description 计算经历的多少分钟(只计算工作日)
* @param param
* @return java.util.Map<java.lang.String,java.lang.Integer>
* @author wangc
* @date 2020.10.21 16:14
*/
@Override
public Map<String,Integer> workMinutes(WorkMinuteFormDTO param) {
List<TimestampIntervalFormDTO> params = param.getTimeList();
if(CollectionUtils.isEmpty(params)) return null;
Map<String,Integer> result = new LinkedHashMap<>();
//默认非精准计算
if(StringUtils.isBlank(param.getIfPrecise()) || !StringUtils.equals(ProjectConstant.PRECISE_CALCULATION,param.getIfPrecise())){
params.forEach(local -> {
result.put(local.getId(),calculateImpreciseDetentionMinutes(local.getLeft(),local.getRight()));
});
return result;
}
//精准计算
if(StringUtils.isBlank(param.getIfCustom()) || !StringUtils.equals(ProjectConstant.CALCULATION_TYPE_CUSTOM,param.getIfCustom())){
//默认
params.forEach(local -> {
result.put(local.getId(),calculateDetentionMinutes(local.getLeft(),local.getRight()));
});
}else{
//自定义
params.forEach(local -> {
try {
result.put(local.getId(), calculateDetentionMinutesWithStartEnd(local.getLeft(), local.getRight(), param.getStartTemplate(), param.getEndTemplate()));
}catch (Exception e){
throw new RenException(e.getMessage());
}
});
}
return result;
}
//公式: 当前日期 - 被吹日期 - 期间的节假日
private String caculateDetentionDays(String startDateStr, String endDateStr) {
if (startDateStr.equals(endDateStr)) {
@ -77,6 +181,249 @@ public class WorkDayServiceImpl implements WorkDayService {
return "-1";
}
/***
* @Description 计算两个日期之间的非准确时间差(只包括工作日)单位分钟 不足一天按照一天计算
* @param left
* @param right
* @return java.lang.Integer
* @author wangc
* @date 2020.10.21 17:09
*/
private Integer calculateImpreciseDetentionMinutes(Date left, Date right){
if(null == left){ logger.error("计算工作日,传入的开始日期为空!");return null;}
//给右区间赋值,默认当前时间
if(null == right || right.compareTo(left) < NumConstant.ZERO) right = new Date();
List<CalenderEntity> list = calenderDao.selectByStartAndEnd(format.format(left),format.format(right));
if(!CollectionUtils.isEmpty(list)){
//集合中只有一个元素,说明两个时间在同一天
if(list.size() == NumConstant.ONE){
return NumConstant.EIGHT * NumConstant.SIXTY;
}
//集合中有两个元素,说明两个时间是相连的
//集合中有两个元素以上,说明两个时间存在跨度
else{
int costMin = NumConstant.ZERO;
if(NumConstant.TWO == list.size()) return costMin;
for(int index = NumConstant.ZERO ; index < list.size() ; index++)
if(StringUtils.equals(ProjectConstant.DAY_TYPE_WORK,list.get(index).getType()))
costMin += NumConstant.TWENTY_FOUR * NumConstant.SIXTY;
return costMin;
}
}
logger.warn("计算工作日,没有找到开始日期和结束日期,可能数据库中没有存储对应时段的数据,开始时间:{},结束时间:{}",left,right);
return null;
}
/**
* @Description 计算两个日期之间的时间差(只包括工作日)单位分钟
* @param left
* @param right
* @return java.lang.Integer
* @author wangc
* @date 2020.10.21 14:00
*/
private Integer calculateDetentionMinutes(Date left ,Date right){
if(null == left){ logger.error("计算工作日,传入的开始日期为空!");return null;}
//给右区间赋值,默认当前时间
if(null == right || right.compareTo(left) < NumConstant.ZERO) right = new Date();
List<CalenderEntity> list = calenderDao.selectByStartAndEnd(format.format(left),format.format(right));
if(!CollectionUtils.isEmpty(list)){
//集合中只有一个元素,说明两个时间在同一天
if(list.size() == NumConstant.ONE){
if(ProjectConstant.DAY_TYPE_WORK.equals(list.get(NumConstant.ZERO).getType()))
return (int)((right.getTime() - left.getTime())/NumConstant.ONE_THOUSAND/NumConstant.SIXTY);
else {
logger.warn("计算工作日,传入的起始时间都在同一天且是在节假日,开始时间:{},结束时间:{},节日类型:{}(1工作日、2周末、3、节假日)",left,right);
return NumConstant.ZERO;
}
}
//集合中有两个元素,说明两个时间是相连的
//集合中有两个元素以上,说明两个时间存在跨度
else{
String leftType = list.get(NumConstant.ZERO).getType();
String rightType = list.get(list.size() - NumConstant.ONE).getType();
int costMin = NumConstant.ZERO;
if(ProjectConstant.DAY_TYPE_WORK.equals(leftType)){
LocalDateTime localDateTime = LocalDateTime.ofInstant(left.toInstant(), ZoneId.systemDefault());
//获取第第二天零点时刻的实例
LocalDateTime tomorrowTime = LocalDateTime.ofInstant(left.toInstant(), ZoneId.systemDefault())
.plusDays(NumConstant.ONE).withHour(NumConstant.ZERO).withMinute(NumConstant.ZERO).withSecond(NumConstant.ZERO).withNano(NumConstant.ZERO);
//ChronoUnit日期枚举类,between方法计算两个时间对象之间的时间量
costMin += ChronoUnit.SECONDS.between(localDateTime, tomorrowTime)/NumConstant.SIXTY;
}
if(ProjectConstant.DAY_TYPE_WORK.equals(rightType)){
LocalDateTime localDateTime = LocalDateTime.ofInstant(right.toInstant(), ZoneId.systemDefault());
//获取第第二天零点时刻的实例
LocalDateTime initialTime = LocalDateTime.ofInstant(right.toInstant(), ZoneId.systemDefault())
.withHour(NumConstant.ZERO).withMinute(NumConstant.ZERO).withSecond(NumConstant.ZERO).withNano(NumConstant.ZERO);
//ChronoUnit日期枚举类,between方法计算两个时间对象之间的时间量
costMin += ChronoUnit.SECONDS.between(localDateTime, initialTime)/NumConstant.SIXTY;
}
if(NumConstant.TWO == list.size()) return costMin;
for(int index = NumConstant.ONE ; index < list.size() - NumConstant.ONE ; index++)
if(StringUtils.equals(ProjectConstant.DAY_TYPE_WORK,list.get(index).getType()))
costMin += NumConstant.TWENTY_FOUR * NumConstant.SIXTY;
return costMin;
}
}
logger.warn("计算工作日,没有找到开始日期和结束日期,可能数据库中没有存储对应时段的数据,开始时间:{},结束时间:{}",left,right);
return null;
}
/***
* @Description 根据可配置的工作起始时间计算两个日期之间的差
* @param left
* @param right
* @param start 格式为 HH:mm:ss
* @param end 格式为 HH:mm:ss
* @return java.lang.Integer
* @author wangc
* @date 2020.10.20 18:05
*/
private Integer calculateDetentionMinutesWithStartEnd(Date left ,Date right, String start, String end)throws Exception{
if(null == left){ logger.error("计算工作日,传入的开始日期为空!");return null;}
if(null == start || null == end){start = "9:00:00"; end = "17:00:00";}
//给右区间赋值,默认当前时间
if(null == right || right.compareTo(left) < NumConstant.ZERO) right = new Date();
//自定义起始时间
String standardStartDateStr = format.format(left).concat(" ").concat(start);
//自定义截至时间
String standardEndDateStr = format.format(right).concat(" ").concat(end);
Date standardStartDate = formatMinute.parse(standardStartDateStr);
Date standardEndDate = formatMinute.parse(standardEndDateStr);
if(standardEndDate.compareTo(standardStartDate) < NumConstant.ZERO){ logger.error("计算工作日,自定义截止日期小于自定义起始日期!");return null;}
//单位时间内规定起止时间的时间差
Integer delta_T = (int)(standardEndDate.getTime() - formatMinute.parse(format.format(right).concat(" ").concat(start)).getTime())/NumConstant.ONE_THOUSAND/NumConstant.SIXTY;
List<CalenderEntity> list = calenderDao.selectByStartAndEnd(format.format(left),format.format(right));
if(!CollectionUtils.isEmpty(list)){
//集合中只有一个元素,说明两个时间在同一天
if(list.size() == NumConstant.ONE){
if(ProjectConstant.DAY_TYPE_WORK.equals(list.get(NumConstant.ZERO).getType())){
//开始时间早于当天规定开始时间
if(left.before(standardStartDate)){
if(right.before(standardStartDate)){
//结束时间早于当天规定开始时间
logger.warn("计算工作日,开始时间与结数时间均早于当天规定的起止计算时间,开始时间:{},结束时间:{},当天开始时间:{}",left,right,standardStartDate);
return NumConstant.ZERO;
}else if(right.before(standardEndDate)){
return (int)(right.getTime() - standardStartDate.getTime())/NumConstant.ONE_THOUSAND/NumConstant.SIXTY;
}else{
//结束时间晚于当天规定截止时间
return delta_T;
}
}else if(left.before(standardEndDate)){
//开始时间在当天规定起止时间之间
if(right.before(standardEndDate)){
return (int)(right.getTime() - left.getTime())/NumConstant.ONE_THOUSAND/NumConstant.SIXTY;
}else{
return (int)(standardEndDate.getTime() - left.getTime())/NumConstant.ONE_THOUSAND/NumConstant.SIXTY;
}
}else{
logger.warn("计算工作日,开始时间与结数时间晚于当天规定的截止计算时间,开始时间:{},结束时间:{},当天截止时间:{}",left,right,standardEndDate);
return NumConstant.ZERO;
}
}else {
logger.warn("计算工作日,传入的起始时间都在同一天且是在节假日,开始时间:{},结束时间:{},节日类型:{}(1工作日、2周末、3、节假日)",left,right);
return NumConstant.ZERO;
}
}
//集合中有两个元素,说明两个时间是相连的
//集合中有两个元素以上,说明两个时间存在跨度
else{
String leftType = list.get(NumConstant.ZERO).getType();
String rightType = list.get(list.size() - NumConstant.ONE).getType();
int costMin = NumConstant.ZERO;
if(ProjectConstant.DAY_TYPE_WORK.equals(leftType)){
if(left.before(standardStartDate)){
costMin += delta_T;
}else if(left.before(standardEndDate)){
costMin += (formatMinute.parse(format.format(left).concat(" ").concat(end)).getTime() - left.getTime())/NumConstant.ONE_THOUSAND/NumConstant.SIXTY;
}else{
}
}
if(ProjectConstant.DAY_TYPE_WORK.equals(rightType)){
Date leftStandardStartDate = formatMinute.parse(format.format(right).concat(" ").concat(end));
if(right.before(leftStandardStartDate)){
}else if(right.before(standardEndDate)){
costMin += (left.getTime() - leftStandardStartDate.getTime())/NumConstant.ONE_THOUSAND/NumConstant.SIXTY;
}else{
costMin += delta_T;
}
}
if(NumConstant.TWO == list.size()) return costMin;
for(int index = NumConstant.ONE ; index < list.size() - NumConstant.ONE ; index++)
if(StringUtils.equals(ProjectConstant.DAY_TYPE_WORK,list.get(index).getType()))
costMin += delta_T * NumConstant.SIXTY;
return costMin;
}
}
logger.warn("计算工作日,没有找到开始日期和结束日期,可能数据库中没有存储对应时段的数据,开始时间:{},结束时间:{}",left,right);
return null;
}
private Integer getWorkDays(Date start, Date end) {
String startDateStr = DateUtils.format(start, DateUtils.DATE_PATTERN_YYYYMMDD);
String endDateStr = DateUtils.format(end, DateUtils.DATE_PATTERN_YYYYMMDD);
if (startDateStr.equals(endDateStr)) {
logger.info(String.format("%s-%s起止时间一致,返回<1,",startDateStr,endDateStr));
return 0;
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
try {
Date startDate = simpleDateFormat.parse(startDateStr);
Date endDate = simpleDateFormat.parse(endDateStr);
long day = (endDate.getTime() - startDate.getTime()) / (24 * 60 * 60 * 1000);
logger.info(String.format("当前日期[%s]-被吹日期[%s]=%s", endDateStr, startDateStr, day));
List<CalenderEntity> list = calenderDao.selectByStartAndEnd(startDateStr, endDateStr);
long totalHoliday = 0;
for (CalenderEntity calenderEntity : list) {
if (!"1".equals(calenderEntity.getType())) {
totalHoliday += 1;
}
}
logger.info(String.format("期间的节假日[%s-%s]=%s", endDateStr, startDateStr, totalHoliday));
long detentionDay = day - totalHoliday;
logger.info(String.format("当前日期[%s]-被吹日期[%s]-期间的节假日[%s]=%s", endDateStr, startDateStr, totalHoliday, detentionDay));
return (int)detentionDay;
} catch (Exception e) {
e.printStackTrace();
}
return -1;
}
private Integer getCalendarDays(Date start, Date end) {
String startDateStr = DateUtils.format(start, DateUtils.DATE_PATTERN_YYYYMMDD);
String endDateStr = DateUtils.format(end, DateUtils.DATE_PATTERN_YYYYMMDD);
if (startDateStr.equals(endDateStr)) {
logger.info(String.format("%s-%s起止时间一致,返回<1,",startDateStr,endDateStr));
return 0;
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
try {
Date startDate = simpleDateFormat.parse(startDateStr);
Date endDate = simpleDateFormat.parse(endDateStr);
long day = (endDate.getTime() - startDate.getTime()) / (24 * 60 * 60 * 1000);
return (int)day;
} catch (Exception e) {
e.printStackTrace();
}
return -1;
}
}

1
epmet-module/epmet-common-service/common-service-server/src/main/resources/mapper/CalenderDao.xml

@ -61,4 +61,5 @@
AND QUERY_DATE BETWEEN #{begin}
AND #{end}
</select>
</mapper>

5
epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/SubAgencyFormDTO.java

@ -39,5 +39,10 @@ public class SubAgencyFormDTO implements Serializable {
@NotBlank(message = "机关组织ID不能为空")
private String agencyId;
/**
* 机关组织数量
*/
private Integer agencyNum = 10;
}

4
epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/SubListResultDTO.java

@ -41,5 +41,9 @@ public class SubListResultDTO implements Serializable {
*/
private String agencyName = "";
/**
* 机关组织级别
*/
private String agencyLevel = "";
}

9
epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java

@ -250,4 +250,13 @@ public interface GovOrgOpenFeignClient {
**/
@PostMapping("/gov/org/customeragency/userinfoext")
Result<ExtUserInfoResultDTO> userInfoExt(@RequestBody ExtUserInfoResultDTO result);
/**
* @param formDTO
* @return
* @Author sun
* @Description 组织首页-下级机关列表
*/
@PostMapping("/gov/org/agency/subagencylist")
Result<SubAgencyResultDTO> subAgencyList(@RequestBody SubAgencyFormDTO formDTO);
}

5
epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java

@ -146,4 +146,9 @@ public class GovOrgOpenFeignClientFallback implements GovOrgOpenFeignClient {
public Result<ExtUserInfoResultDTO> userInfoExt(ExtUserInfoResultDTO result) {
return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "userInfoExt", result);
}
@Override
public Result<SubAgencyResultDTO> subAgencyList(SubAgencyFormDTO formDTO) {
return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "subAgencyList", formDTO);
}
}

1
epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/AgencyController.java

@ -38,7 +38,6 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.xml.validation.Validator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

2
epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerAgencyDao.java

@ -57,7 +57,7 @@ public interface CustomerAgencyDao extends BaseDao<CustomerAgencyEntity> {
* @Author sun
* @Description 组织首页-下级机关列表
**/
List<SubListResultDTO> selectSubAgencyById(@Param("pId") String pId);
List<SubListResultDTO> selectSubAgencyById(@Param("pId") String pId, @Param("agencyNum") Integer agencyNum);
/**
* @param pId

6
epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/AgencyServiceImpl.java

@ -25,14 +25,12 @@ import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.utils.Result;
import com.epmet.constant.CustomerAgencyConstant;
import com.epmet.constant.RoleKeyConstants;
import com.epmet.constant.UserWorkType;
import com.epmet.dao.CustomerAgencyDao;
import com.epmet.dto.CustomerAgencyDTO;
import com.epmet.dto.GovStaffRoleDTO;
import com.epmet.dto.form.*;
import com.epmet.dto.result.*;
import com.epmet.entity.CustomerAgencyEntity;
import com.epmet.feign.EpmetUserFeignClient;
import com.epmet.feign.EpmetUserOpenFeignClient;
import com.epmet.redis.CustomerAgencyRedis;
import com.epmet.service.AgencyService;
@ -177,7 +175,7 @@ public class AgencyServiceImpl implements AgencyService {
public Result removeAgency(RemoveAgencyFormDTO formDTO) {
Result result = new Result();
//1:查询当前机关是否存在所属下级机关,存在下级的不能删除
List<SubListResultDTO> agencyList = customerAgencyDao.selectSubAgencyById(formDTO.getAgencyId());
List<SubListResultDTO> agencyList = customerAgencyDao.selectSubAgencyById(formDTO.getAgencyId(), 10);
if (null != agencyList && agencyList.size() > NumConstant.ZERO) {
result.setCode(EpmetErrorCode.NOT_DEL_AGENCY.getCode());
result.setMsg(EpmetErrorCode.NOT_DEL_AGENCY.getMsg());
@ -238,7 +236,7 @@ public class AgencyServiceImpl implements AgencyService {
public Result<SubAgencyResultDTO> subAgencyList(SubAgencyFormDTO formDTO) {
SubAgencyResultDTO subAgencyResultDTO = new SubAgencyResultDTO();
//1:根据当前机关Id查询直属下一级机关列表,只返回前十条
List<SubListResultDTO> agencyList = customerAgencyDao.selectSubAgencyById(formDTO.getAgencyId());
List<SubListResultDTO> agencyList = customerAgencyDao.selectSubAgencyById(formDTO.getAgencyId(),formDTO.getAgencyNum());
if (null == agencyList || agencyList.size() < NumConstant.ONE) {
subAgencyResultDTO.setAgencyList(new ArrayList<SubListResultDTO>());
subAgencyResultDTO.setSubAgencyCount(NumConstant.ZERO);

4
epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml

@ -62,11 +62,13 @@
<select id="selectSubAgencyById" resultType="com.epmet.dto.result.SubListResultDTO">
SELECT
id AS 'agencyId',
organization_name AS 'agencyName'
organization_name AS 'agencyName',
`level` AS 'agencyLevel'
FROM customer_agency
WHERE del_flag = '0'
AND pid = #{pId}
ORDER BY created_time DESC
LIMIT #{agencyNum}
</select>
<select id="selectAgencyList" resultType="com.epmet.dto.result.AgencyListResultDTO">

113
epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/ProjectOrgRelationDTO.java

@ -0,0 +1,113 @@
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.epmet.dto;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 项目机关历时关系表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2020-10-19
*/
@Data
public class ProjectOrgRelationDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
*/
private String id;
/**
* 关联PROJECT_STAFF由此ID可以关联出PROJECT_IDCUSTOMER_IDPROCESS_ID
*/
private String projectStaffId;
/**
* 流转到的日期 同CREATED_TIME
*/
private Date informedDate;
/**
* 流转走或结案的日期
*/
private Date handledDate;
/**
* 节点耗时从流转到自己到流转走共耗时单位分钟如果项目还没有结案且该项目在这个组织下一直滞留这一项为空
* 8*60的倍数
*/
private Integer totalPeriod;
/**
* 第一次响应时间
*/
private Date firstDealtDate;
/**
* 首次响应时长单位分钟
* 8*60的倍数
*/
private Integer firstReplyPeriod;
/**
* 来源动作return(回退)transfer(流转)closed(结案)response(响应)created(立项时第一个流转到的)
*/
private String sourceOperation;
/**
* 处理动作return(回退)transfer(流转)closed(结案)response(响应)
*/
private String operation;
/**
* 删除标识
*/
private String delFlag;
/**
* 乐观锁
*/
private Integer revision;
/**
*
*/
private Date createdTime;
/**
*
*/
private String createdBy;
/**
*
*/
private Date updatedTime;
/**
*
*/
private String updatedBy;
}

20
epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/ProjectProcessDTO.java

@ -114,4 +114,24 @@ public class ProjectProcessDTO implements Serializable {
*/
private Date updatedTime;
/**
* 节点发起人所属机关Id
*/
private String agencyId;
/**
* 节点发起人所属部门Id 可空
*/
private String departmentId;
/**
* 节点发起人所属网格Id 可空
*/
private String gridId;
/**
* 节点发起人所属机关全路径
*/
private String orgIdPath;
}

28
epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/OverdueAndDelayDTO.java

@ -0,0 +1,28 @@
package com.epmet.dto.result;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @author zhaoqifeng
* @dscription
* @date 2020/10/22 15:45
*/
@Data
public class OverdueAndDelayDTO implements Serializable {
private static final long serialVersionUID = -3632539647818460833L;
/**
* 工作人员ID
*/
private String staffId;
/**
* 即将超期
*/
private List<StaffUnHandledDTO> overdueList;
/**
* 滞留
*/
private List<StaffUnHandledDTO> delayList;
}

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;
}

41
epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/StaffUnHandledDTO.java

@ -0,0 +1,41 @@
package com.epmet.dto.result;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author zhaoqifeng
* @dscription
* @date 2020/10/21 16:48
*/
@Data
public class StaffUnHandledDTO implements Serializable {
private static final long serialVersionUID = 5257146338113364709L;
/**
* project_staff ID
*/
private String id;
/**
* 项目ID
*/
private String projectId;
/**
* 项目标题
*/
private String title;
/**
* 工作人员ID
*/
private String staffId;
/**
* 吹哨时间
*/
private Date createdTime;
/**
* 响应处理时间
*/
private Date updatedTime;
}

6
epmet-module/gov-project/gov-project-server/pom.xml

@ -54,6 +54,12 @@
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.3</version>
<scope>compile</scope>
</dependency>
<!-- 替换Feign原生httpclient -->
<dependency>
<groupId>io.github.openfeign</groupId>

30
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/ParameterKeyConstant.java

@ -11,4 +11,34 @@ public interface ParameterKeyConstant {
* 可滞留天数
*/
String DETENTION_DAYS = "detention_days";
/**
* 计算方式
*/
String CALCULATION = "calculation";
/**
* 计算方式-工作日
*/
String WORK = "work";
/**
* 计算方式-日历天
*/
String CALENDAR = "calendar";
/**
* 即将超期提醒时间
*/
String REMIND_TIME = "remind_time";
/**
* 推送时间
*/
String PUSH_TIME = "push_time";
/**
* 起止时间
*/
String START_AND_END_TIME = "start_and_end_time";
}

20
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/ProjectConstant.java

@ -128,4 +128,24 @@ public interface ProjectConstant {
String SAVE_PROJECT_EXCEPTION = "已存在项目数据,不能重复转项目";
String REVIEW_PROJECT = "项目评论失败,评论内容为:%s";
/***
* 计算方式 使用自定应
*/
String CALCULATION_TYPE_CUSTOM = "custom";
/**
* 计算方式 使用默认24小时制
*/
String CALCULATION_TYPE_DEFAULT = "default";
/**
* 精准计算
*/
String PRECISE_CALCULATION = "precise";
/**
* 非精准计算
*/
String IMPRECISE_CALCULATION = "imprecise";
}

31
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/UserMessageConstant.java

@ -21,4 +21,35 @@ public interface UserMessageConstant {
*/
String PROJECT_CLOSED_MSG = "您好,您参与的【%s】项目已结案,原因:%s";
/**
* 滞留超期消息标题
*/
String STAY_REMINDER_TITLE_1 = "您有%d个项目即将超期,%d个项目已经滞留";
/**
* 滞留超期消息模板
*/
String STAY_REMINDER_MSG_1 = "即将超期项目:%n%s 滞留项目:%n%s";
/**
* 滞留超期消息标题
*/
String STAY_REMINDER_TITLE_2 = "您有%d个项目即将超期";
/**
* 滞留超期消息模板
*/
String STAY_REMINDER_MSG_2 = "即将超期项目:%n%s";
/**
* 滞留超期消息标题
*/
String STAY_REMINDER_TITLE_3 = "您有%d个项目已经滞留";
/**
* 滞留超期消息模板
*/
String STAY_REMINDER_MSG_3 = "滞留项目:%n%s";
}

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

@ -151,5 +151,15 @@ public class ProjectController {
List<PendProjectListResultDTO> result = projectService.getPendProjectList(fromDTO);
return new Result<List<PendProjectListResultDTO>>().ok(result);
}
@PostMapping("message")
public Result sendMessage(@RequestBody ProjectDTO formDTO) {
projectService.sendMessage(formDTO.getCustomerId());
return new Result();
}
@PostMapping("compensation")
public Result compensation(){
projectService.projectProcessCostTimeDataCompensation();
return new Result();
}
}

13
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/CustomerProjectParameterDao.java

@ -18,10 +18,14 @@
package com.epmet.dao;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.dto.CustomerProjectParameterDTO;
import com.epmet.entity.CustomerProjectParameterEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* 项目客户参数订制表
*
@ -38,5 +42,14 @@ public interface CustomerProjectParameterDao extends BaseDao<CustomerProjectPara
* @return java.lang.String
*/
String selectParameterValueByKey(CustomerProjectParameterEntity entity);
/**
* 获取客户下所有配置参数
* @author zhaoqifeng
* @date 2020/10/21 14:18
* @param customerId
* @return java.util.List<com.epmet.dto.CustomerProjectParameterDTO>
*/
List<CustomerProjectParameterDTO> getParameterByCustomer(@Param("customerId") String customerId);
}

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();
}

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

@ -0,0 +1,91 @@
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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;
import java.util.List;
/**
* 项目机关历时关系表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2020-10-19
*/
@Mapper
public interface ProjectOrgRelationDao extends BaseDao<ProjectOrgRelationEntity> {
/***
* @Description
* @param entity
* @return int
* @author wangc
* @date 2020.10.20 14:18
*/
int maintainTimePropertyConsistency(ProjectOrgRelationEntity entity);
/***
* @Description 批量插入
* @param list
* @return void
* @author wangc
* @date 2020.10.20 09:57
*/
void insertBatch(@Param("list") List<ProjectOrgRelationEntity> list);
/***
* @Description 根据projectStaffId查找项目机关关联的数据
* @param projectStaffId
* @return com.epmet.entity.ProjectOrgRelationEntity
* @author wangc
* @date 2020.10.21 15:37
*/
ProjectOrgRelationEntity selectByProjectStaffId(@Param("projectStaffId") String projectStaffId);
/***
* @Description 查询出所有未处理的节点耗时记录 - 结案时使用
* @param projectId
* @return java.util.List<com.epmet.entity.ProjectOrgRelationEntity>
* @author wangc
* @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);
}

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

@ -20,6 +20,7 @@ package com.epmet.dao;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.dto.ProjectStaffDTO;
import com.epmet.dto.result.DepartmentResultDTO;
import com.epmet.dto.result.StaffUnHandledDTO;
import com.epmet.entity.ProjectStaffEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -79,4 +80,44 @@ public interface ProjectStaffDao extends BaseDao<ProjectStaffEntity> {
* @return java.util.List<java.lang.String>
*/
List<String> selectCreatedProcess(ProjectStaffDTO dto);
/**
* 获取未做处理的节点
* @author zhaoqifeng
* @date 2020/10/21 16:56
* @param customerId
* @return java.util.List<com.epmet.dto.result.StaffUnHandledDTO>
*/
List<StaffUnHandledDTO> getStaffUnHandledList(@Param("customerId") String customerId);
/***
* @Description 根据项目ID查询项目-人员表的ID
* @param projectId
* @return java.util.List<java.lang.String>
* @author wangc
* @date 2020.10.19 18:00
*/
List<String> selectIdByProjectId(@Param("projectId") String projectId);
/**
* @Description 根据项目Id和工作人员Id查找最新的project_staff表的ID
* @param projectId
* @param staffId
* @return com.epmet.dto.ProjectStaffDTO
* @author wangc
* @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);
}

83
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/ProjectOrgRelationEntity.java

@ -0,0 +1,83 @@
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.epmet.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.epmet.commons.mybatis.entity.BaseEpmetEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 项目机关历时关系表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2020-10-19
*/
@Data
@EqualsAndHashCode(callSuper=false)
@TableName("project_org_relation")
public class ProjectOrgRelationEntity extends BaseEpmetEntity {
private static final long serialVersionUID = 1L;
/**
* 关联PROJECT_STAFF由此ID可以关联出PROJECT_IDCUSTOMER_IDPROCESS_ID
*/
private String projectStaffId;
/**
* 流转到的日期 同CREATED_TIME
*/
private Date informedDate;
/**
* 流转走或结案的日期
*/
private Date handledDate;
/**
* 节点耗时从流转到自己到流转走共耗时单位分钟如果项目还没有结案且该项目在这个组织下一直滞留这一项为空
* 8*60的倍数
*/
private Integer totalPeriod;
/**
* 第一次响应时间
*/
private Date firstDealtDate;
/**
* 首次响应时长单位分钟
* 8*60的倍数
*/
private Integer firstReplyPeriod;
/**
* 来源动作return(回退)transfer(流转)closed(结案)response(响应)created(立项时第一个流转到的)
*/
private String sourceOperation;
/**
* 处理动作return(回退)transfer(流转)closed(结案)response(响应)
*/
private String operation;
}

25
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/ProjectProcessEntity.java

@ -43,6 +43,11 @@ public class ProjectProcessEntity extends BaseEpmetEntity {
*/
private String projectId;
/**
* 项目改造新增字段客户Id
*/
private String customerId;
/**
* 部门名
*/
@ -83,4 +88,24 @@ public class ProjectProcessEntity extends BaseEpmetEntity {
*/
private String costWorkdays;
/**
* 节点发起人所属机关Id
*/
private String agencyId;
/**
* 节点发起人所属部门Id 可空
*/
private String departmentId;
/**
* 节点发起人所属网格Id 可空
*/
private String gridId;
/**
* 节点发起人所属机关全路径
*/
private String orgIdPath;
}

9
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/CustomerProjectParameterService.java

@ -101,4 +101,13 @@ public interface CustomerProjectParameterService extends BaseService<CustomerPro
* @return CustomerProjectParameterDTO
*/
String getParameterValueByKey(CustomerProjectParameterDTO dto);
/**
* 获取客户下所有配置参数
* @author zhaoqifeng
* @date 2020/10/21 14:24
* @param customerId
* @return java.util.List<com.epmet.dto.CustomerProjectParameterDTO>
*/
List<CustomerProjectParameterDTO> getParameterByCustomer(String customerId);
}

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

@ -19,7 +19,6 @@ 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.*;
@ -143,4 +142,13 @@ public interface ProjectProcessService extends BaseService<ProjectProcessEntity>
*/
ProcessAndCurrentDeptResultDTO progressAndCurrentDept(ProcessListFormDTO formDTO);
/**
* @Description 查询项目-机关各个节点的响应列表
* @param projects
* @return
* @author wangc
* @date 2020.09.17 17:56
**/
List<ProjectOrgRelationWhenResponseResultDTO > selectResponseTrace(List<String> projects);
}

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

@ -188,4 +188,23 @@ public interface ProjectService extends BaseService<ProjectEntity> {
* @return void
*/
void response(ProjectResponseFormDTO formDTO);
/**
* 项目滞留超期提醒
* @author zhaoqifeng
* @date 2020/10/21 15:21
* @param customerId
* @return void
*/
void sendMessage(String customerId);
/**
* @Description 项目节点耗时数据补齐
* @param
* @return void
* @author wangc
* @date 2020.10.26 10:54
*/
void projectProcessCostTimeDataCompensation();
}

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

@ -23,8 +23,10 @@ import com.epmet.dto.ProjectStaffDTO;
import com.epmet.dto.form.DepartmentStaffListFormDTO;
import com.epmet.dto.result.DepartmentResultDTO;
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;
@ -140,4 +142,42 @@ public interface ProjectStaffService extends BaseService<ProjectStaffEntity> {
* @return java.util.List<java.lang.String>
*/
List<String> getCreatedProcess(ProjectStaffDTO dto);
/**
* 获取未做处理的节点
* @author zhaoqifeng
* @date 2020/10/21 16:54
* @param customerId
* @return java.util.List<com.epmet.dto.result.StaffUnHandledDTO>
*/
List<StaffUnHandledDTO> getStaffUnHandledList(String customerId);
/***
* @Description 根据项目ID查询项目-人员表的ID
* @param projectId
* @return java.util.List<java.lang.String>
* @author wangc
* @date 2020.10.19 18:00
*/
List<String> getIdByProjectId(String projectId);
/**
* @Description 根据项目Id和工作人员Id查找最新的project_staff表的ID
* @param projectId
* @param staffId
* @return com.epmet.dto.ProjectStaffDTO
* @author wangc
* @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);
}

13
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/CustomerProjectParameterServiceImpl.java

@ -107,4 +107,17 @@ public class CustomerProjectParameterServiceImpl extends BaseServiceImpl<Custome
return baseDao.selectParameterValueByKey(entity);
}
/**
* 获取客户下所有配置参数
*
* @param customerId
* @return java.util.List<com.epmet.dto.CustomerProjectParameterDTO>
* @author zhaoqifeng
* @date 2020/10/21 14:16
*/
@Override
public List<CustomerProjectParameterDTO> getParameterByCustomer(String customerId) {
return baseDao.getParameterByCustomer(customerId);
}
}

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

@ -17,6 +17,7 @@
package com.epmet.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
@ -36,6 +37,7 @@ import com.epmet.constant.ProjectConstant;
import com.epmet.constant.ReadFlagConstant;
import com.epmet.constant.UserMessageConstant;
import com.epmet.dao.ProjectDao;
import com.epmet.dao.ProjectOrgRelationDao;
import com.epmet.dao.ProjectProcessDao;
import com.epmet.dao.ProjectStaffDao;
import com.epmet.dto.ProjectDTO;
@ -44,8 +46,10 @@ import com.epmet.dto.ProjectStaffDTO;
import com.epmet.dto.form.*;
import com.epmet.dto.result.*;
import com.epmet.entity.ProjectEntity;
import com.epmet.entity.ProjectOrgRelationEntity;
import com.epmet.entity.ProjectProcessEntity;
import com.epmet.entity.ProjectStaffEntity;
import com.epmet.feign.EpmetCommonServiceOpenFeignClient;
import com.epmet.feign.EpmetUserFeignClient;
import com.epmet.feign.EpmetUserOpenFeignClient;
import com.epmet.feign.GovOrgFeignClient;
@ -53,11 +57,13 @@ import com.epmet.redis.ProjectProcessRedis;
import com.epmet.service.ProjectProcessService;
import com.epmet.service.ProjectService;
import com.epmet.service.ProjectStaffService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.stream.Collectors;
@ -69,6 +75,7 @@ import java.util.stream.Collectors;
* @since v1.0.0 2020-05-11
*/
@Service
@Slf4j
public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessDao, ProjectProcessEntity> implements ProjectProcessService {
@Autowired
@ -87,6 +94,10 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessDao
private ProjectStaffService projectStaffService;
@Autowired
private com.epmet.feign.MessageFeignClient messageFeignClient;
@Autowired
private EpmetCommonServiceOpenFeignClient epmetCommonServiceOpenFeignClient;
@Autowired
private ProjectOrgRelationDao relationDao;
@Value("${openapi.scan.server.url}")
private String scanApiUrl;
@Value("${openapi.scan.method.textSyncScan}")
@ -223,12 +234,18 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessDao
if (projectStaffDao.updateById(staffEntity) < NumConstant.ONE) {
throw new RenException(ProjectConstant.UPDATE_PROJECTSTAFF_EXCEPTION);
}
//2:项目处理进展列表新增数据
ProjectProcessEntity processEntity = ConvertUtils.sourceToTarget(formDTO, ProjectProcessEntity.class);
processEntity.setCustomerId(staffEntity.getCustomerId());
processEntity.setDepartmentName(staffEntity.getDepartmentName());
processEntity.setStaffId(staffEntity.getStaffId());
processEntity.setOperation(ProjectConstant.OPERATION_TRANSFER);
processEntity.setOperationName(ProjectConstant.OPERATION_TRANSFER_NAME);
processEntity.setAgencyId(staffEntity.getOrgId());
processEntity.setDepartmentId(staffEntity.getDepartmentId());
processEntity.setGridId(staffEntity.getGridId());
processEntity.setOrgIdPath(staffEntity.getOrgIdPath());
projectProcessDao.insert(processEntity);
//3:项目人员关联表新增部门流转数据
List<TickStaffFormDTO> staffList = formDTO.getStaffList();
@ -284,6 +301,48 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessDao
});
projectStaffService.insertBatch(entityList);
//3.3 项目机关历时关系 project_org_relation 更新原来的
ProjectOrgRelationEntity orientRelation = relationDao.selectByProjectStaffId(staffEntity.getId());
if(null == orientRelation){
log.error("com.epmet.service.impl.ProjectProcessServiceImpl.transfer,找不到项目节点机关历时记录,参数:{}",JSON.toJSONString(formDTO));
}
Date current = new Date();
WorkMinuteFormDTO timeParam = new WorkMinuteFormDTO();
timeParam.setIfPrecise(ProjectConstant.IMPRECISE_CALCULATION);
timeParam.setIfCustom(ProjectConstant.CALCULATION_TYPE_DEFAULT);
TimestampIntervalFormDTO interval = new TimestampIntervalFormDTO(orientRelation.getProjectStaffId(),orientRelation.getInformedDate(),current);
List<TimestampIntervalFormDTO> intervalList = new LinkedList<>();intervalList.add(interval);
timeParam.setTimeList(intervalList);
Result<Map<String,Integer>> timeResult = epmetCommonServiceOpenFeignClient.workMinutes(timeParam);
if(timeResult.success() && !CollectionUtils.isEmpty(timeResult.getData()) && null != timeResult.getData().get(staffEntity.getId())){
ProjectOrgRelationEntity relationDto = new ProjectOrgRelationEntity();
relationDto.setProjectStaffId(orientRelation.getProjectStaffId());
relationDto.setHandledDate(current);
relationDto.setTotalPeriod(timeResult.getData().get(staffEntity.getId()));
relationDto.setOperation(ProjectConstant.OPERATION_TRANSFER);
if(null == orientRelation.getFirstDealtDate()){
relationDto.setFirstDealtDate(current);
relationDto.setFirstReplyPeriod(relationDto.getTotalPeriod());
}
relationDao.maintainTimePropertyConsistency(relationDto);
}else{
log.error("com.epmet.service.impl.ProjectProcessServiceImpl.transfer,计算节点耗时失败,参数:{}", JSON.toJSONString(timeParam));
throw new RenException("计算节点耗时失败");
}
//3.4 项目机关历时关系 project_org_relation 插入新增的
List<ProjectOrgRelationEntity> relationList = new LinkedList<>();
entityList.forEach(staff -> {
ProjectOrgRelationEntity relation = new ProjectOrgRelationEntity();
relation.setProjectStaffId(staff.getId());
relation.setInformedDate(current);
relation.setSourceOperation(ProjectConstant.OPERATION_TRANSFER);
relationList.add(relation);
});
relationDao.insertBatch(relationList);
//4:调用epmet-message服务,给项目流转过程中的工作人员发送消息
if (!transferMessage(formDTO).success()) {
throw new RenException(ProjectConstant.SAVE_MSG_EXCEPTION);
@ -407,4 +466,16 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessDao
}
return result;
}
/**
* @Description 查询项目-机关各个节点的响应列表
* @param projects
* @return
* @author wangc
* @date 2020.09.17 17:56
**/
@Override
public List<ProjectOrgRelationWhenResponseResultDTO> selectResponseTrace(List<String> projects) {
return baseDao.selectResponseTrace(projects);
}
}

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

@ -17,13 +17,11 @@
package com.epmet.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
import com.epmet.commons.tools.constant.AppClientConstant;
import com.epmet.commons.tools.constant.Constant;
import com.epmet.commons.tools.constant.FieldConstant;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.constant.*;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.page.PageData;
@ -37,24 +35,27 @@ import com.epmet.constant.ParameterKeyConstant;
import com.epmet.constant.ProjectConstant;
import com.epmet.constant.UserMessageConstant;
import com.epmet.dao.ProjectDao;
import com.epmet.dao.ProjectOrgRelationDao;
import com.epmet.dto.*;
import com.epmet.dto.form.*;
import com.epmet.dto.result.*;
import com.epmet.entity.ProjectEntity;
import com.epmet.entity.ProjectProcessEntity;
import com.epmet.entity.ProjectRelatedPersonnelEntity;
import com.epmet.entity.ProjectStaffEntity;
import com.epmet.entity.*;
import com.epmet.feign.*;
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;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@ -64,6 +65,7 @@ import java.util.stream.Collectors;
* @since v1.0.0 2020-05-11
*/
@Service
@Slf4j
public class ProjectServiceImpl extends BaseServiceImpl<ProjectDao, ProjectEntity> implements ProjectService {
@Autowired
@ -90,6 +92,8 @@ public class ProjectServiceImpl extends BaseServiceImpl<ProjectDao, ProjectEntit
private String scanApiUrl;
@Value("${openapi.scan.method.textSyncScan}")
private String textSyncScanMethod;
@Autowired
private ProjectOrgRelationDao relationDao;
private final static String ONE_DAY = "<1";
@ -358,6 +362,8 @@ public class ProjectServiceImpl extends BaseServiceImpl<ProjectDao, ProjectEntit
if (ProjectConstant.CLOSED.equals(projectEntity.getStatus())) {
throw new RenException(EpmetErrorCode.PROJECT_IS_CLOSED.getCode());
}
Date current = new Date();
projectEntity.setStatus(ProjectConstant.CLOSED);
projectEntity.setClosedStatus(fromDTO.getClosedStatus());
baseDao.updateById(projectEntity);
@ -367,19 +373,66 @@ public class ProjectServiceImpl extends BaseServiceImpl<ProjectDao, ProjectEntit
projectStaffEntity.setIsHandle(ProjectConstant.HANDLE);
projectStaffService.updateById(projectStaffEntity);
//查询结案人员的信息
ProjectStaffEntity operatorProjectReference = projectStaffService.selectById(fromDTO.getProjectStaffId());
if(null == operatorProjectReference){
log.error("com.epmet.service.impl.ProjectServiceImpl.closed,找不到结案工作人员的相关记录,参数:{}",JSON.toJSONString(fromDTO));
throw new RenException("找不到结案工作人员的相关记录");
}
//结案记录加入项目进展表
ProjectProcessEntity projectProcessEntity = new ProjectProcessEntity();
projectProcessEntity.setProjectId(fromDTO.getProjectId());
projectProcessEntity.setCustomerId(operatorProjectReference.getCustomerId());
projectProcessEntity.setDepartmentName(fromDTO.getDepartmentName());
projectProcessEntity.setAgencyId(operatorProjectReference.getOrgId());
projectProcessEntity.setGridId(operatorProjectReference.getGridId());
projectProcessEntity.setDepartmentId(operatorProjectReference.getDepartmentId());
projectProcessEntity.setOrgIdPath(operatorProjectReference.getOrgIdPath());
projectProcessEntity.setEndTime(new Date());
projectProcessEntity.setOperation(ProjectConstant.OPERATION_CLOSE);
projectProcessEntity.setOperationName(ProjectConstant.OPERATION_CLOSE_NAME);
projectProcessEntity.setPublicReply(fromDTO.getPublicReply());
projectProcessEntity.setInternalRemark(fromDTO.getInternalRemark());
projectProcessEntity.setStaffId(fromDTO.getUserId());
projectProcessEntity.setCostWorkdays(getDetentionDays(ConvertUtils.sourceToTarget(projectEntity, ProjectDTO.class)));
ProjectDTO projectDto = ConvertUtils.sourceToTarget(projectEntity, ProjectDTO.class);
projectDto.setUpdatedTime(projectDto.getCreatedTime());
projectProcessEntity.setCostWorkdays(getDetentionDays(projectDto));
projectProcessService.insert(projectProcessEntity);
//对项目节点耗时记录进行更新,更新全部未处理节点以及结案人的节点耗时
//List<ProjectOrgRelationEntity> periodsToUpdate = relationDao.selectAllUnhandledProcess(fromDTO.getProjectId());
//if(CollectionUtils.isEmpty(periodsToUpdate)){
// log.error("com.epmet.service.impl.ProjectServiceImpl.closed,至少存在一条处理时间为空的项目节点耗时记录,但是没有找到,参数:{}",JSON.toJSONString(fromDTO));
// throw new RenException("至少存在一条处理时间为空的项目节点耗时记录,但是没有找到");
//}
//List<TimestampIntervalFormDTO> intervalList = new LinkedList<>();
//periodsToUpdate.forEach(local -> {
// TimestampIntervalFormDTO obj = new TimestampIntervalFormDTO();
// obj.setId(local.getProjectStaffId());
// obj.setLeft(local.getInformedDate());
// obj.setRight(current);
// intervalList.add(obj);
//});
ProjectOrgRelationEntity orientRelation = relationDao.selectByProjectStaffId(operatorProjectReference.getId());
if(null == orientRelation){
log.error("com.epmet.service.impl.ProjectServiceImpl.closed,找不到结案工作人员的节点耗时相关记录,参数:{}",JSON.toJSONString(fromDTO));
throw new RenException("找不到结案工作人员的节点耗时相关记录");
}
Integer delta_t = calculateDelta_T(ProjectConstant.IMPRECISE_CALCULATION,
ProjectConstant.CALCULATION_TYPE_DEFAULT, operatorProjectReference.getId(),orientRelation.getInformedDate(),current);
ProjectOrgRelationEntity carrier = new ProjectOrgRelationEntity();
carrier.setProjectStaffId(operatorProjectReference.getId());
carrier.setOperation(ProjectConstant.OPERATION_CLOSE);
carrier.setHandledDate(current);
carrier.setFirstReplyPeriod(delta_t);
relationDao.maintainTimePropertyConsistency(carrier);
//通知
List<UserMessageFormDTO> msgList = new ArrayList<>();
//通知项目相关人员
@ -437,16 +490,30 @@ public class ProjectServiceImpl extends BaseServiceImpl<ProjectDao, ProjectEntit
throw new RenException(EpmetErrorCode.PROJECT_IS_CLOSED.getCode());
}
Date current = new Date();
//更新项目关联表
ProjectStaffEntity projectStaffEntity = new ProjectStaffEntity();
projectStaffEntity.setId(fromDTO.getProjectStaffId());
projectStaffEntity.setIsHandle(ProjectConstant.HANDLE);
projectStaffService.updateById(projectStaffEntity);
//查找对应的project_staff的信息,为了取出机关的信息,给即将要生成的“退回”节点赋值
ProjectStaffEntity sourceProjectStaff = projectStaffService.selectById(fromDTO.getProjectStaffId());
if(null == sourceProjectStaff){
log.error("com.epmet.service.impl.ProjectServiceImpl.projectReturn,找不到发起退回的项目相关人员的记录,参数:{}",JSON.toJSONString(fromDTO));
throw new RenException("找不到发起退回的项目相关人员的记录");
}
//结案记录加入项目进展表
ProjectProcessEntity projectProcessEntity = new ProjectProcessEntity();
projectProcessEntity.setProjectId(fromDTO.getProjectId());
projectProcessEntity.setCustomerId(sourceProjectStaff.getCustomerId());
projectProcessEntity.setDepartmentName(fromDTO.getDepartmentName());
projectProcessEntity.setOrgIdPath(sourceProjectStaff.getOrgIdPath());
projectProcessEntity.setGridId(sourceProjectStaff.getGridId());
projectProcessEntity.setDepartmentId(sourceProjectStaff.getDepartmentId());
projectProcessEntity.setAgencyId(sourceProjectStaff.getOrgId());
projectProcessEntity.setOperation(ProjectConstant.OPERATION_RETURN);
projectProcessEntity.setOperationName(ProjectConstant.OPERATION_RETURN_NAME);
projectProcessEntity.setPublicReply(fromDTO.getPublicReply());
@ -459,12 +526,41 @@ public class ProjectServiceImpl extends BaseServiceImpl<ProjectDao, ProjectEntit
ProjectStaffEntity projectStaff = ConvertUtils.sourceToTarget(projectStaffDTO, ProjectStaffEntity.class);
projectStaff.setId(null);
//防止将被退回的项目相关人员节点的创建时间赋值给新增的相关人员节点的创建时间,否则数据统计将出现误差
projectStaff.setCreatedTime(null);
projectStaff.setUpdatedTime(null);
projectStaff.setCreatedTime(current);
projectStaff.setUpdatedTime(current);
projectStaff.setProcessId(projectProcessEntity.getId());
projectStaff.setIsHandle(ProjectConstant.UNHANDLED);
projectStaffService.insert(projectStaff);
//更新退回发起人的节点耗时记录
ProjectOrgRelationEntity orientRelation = relationDao.selectByProjectStaffId(fromDTO.getProjectStaffId());
if(null == orientRelation){
log.error("com.epmet.service.impl.ProjectServiceImpl.projectReturn,找不到发起退回的项目相关人员的节点耗时记录,参数:{}",JSON.toJSONString(fromDTO));
throw new RenException("找不到发起退回的项目相关人员的节点耗时记录");
}
ProjectOrgRelationEntity relationDto = new ProjectOrgRelationEntity();
relationDto.setProjectStaffId(orientRelation.getProjectStaffId());
relationDto.setHandledDate(current);
Integer costTime = calculateDelta_T(ProjectConstant.IMPRECISE_CALCULATION,
ProjectConstant.CALCULATION_TYPE_DEFAULT,
orientRelation.getProjectStaffId(),
orientRelation.getInformedDate(),
current);
relationDto.setTotalPeriod(costTime);
relationDto.setOperation(ProjectConstant.OPERATION_RETURN);
if(null == orientRelation.getFirstDealtDate()){
relationDto.setFirstDealtDate(current);
relationDto.setFirstReplyPeriod(costTime);
}
relationDao.maintainTimePropertyConsistency(relationDto);
//初始化被退回人的节点耗时记录
ProjectOrgRelationEntity newRelation = new ProjectOrgRelationEntity();
newRelation.setProjectStaffId(projectStaff.getId());
newRelation.setSourceOperation(ProjectConstant.OPERATION_RETURN);
newRelation.setInformedDate(current);
relationDao.insert(newRelation);
//通知
List<UserMessageFormDTO> msgList = new ArrayList<>();
UserMessageFormDTO messageFormDTO = new UserMessageFormDTO();
@ -593,6 +689,7 @@ public class ProjectServiceImpl extends BaseServiceImpl<ProjectDao, ProjectEntit
//3:项目处理进展表新增数据
ProjectProcessEntity processEntity = new ProjectProcessEntity();
processEntity.setProjectId(projectEntity.getId());
processEntity.setCustomerId(issueDTO.getCustomerId());
processEntity.setStaffId(formDTO.getStaffId());
processEntity.setOperation(ProjectConstant.OPERATION_CREATED);
processEntity.setOperationName(ProjectConstant.OPERATION_CREATED_NAME);
@ -601,11 +698,18 @@ public class ProjectServiceImpl extends BaseServiceImpl<ProjectDao, ProjectEntit
agencyDeptGrid.getAgencyList().forEach(agency -> {
if (issueDTO.getOrgId().equals(agency.getId())) {
processEntity.setDepartmentName(agency.getOrganizationName());
processEntity.setAgencyId(agency.getId());
if(StringUtils.isBlank(agency.getPids()) || StringUtils.equals(NumConstant.ZERO_STR,agency.getPids().trim()) || "".equals(agency.getPids().trim())){
processEntity.setOrgIdPath(agency.getId());
}else{
processEntity.setOrgIdPath(agency.getPids().concat(":").concat(agency.getId()));
}
}
});
agencyDeptGrid.getGridList().forEach(grid -> {
if (issueDTO.getGridId().equals(grid.getId())) {
processEntity.setDepartmentName(processEntity.getDepartmentName() + "-" + grid.getGridName());
processEntity.setGridId(grid.getId());
}
});
projectProcessService.insert(processEntity);
@ -643,6 +747,24 @@ public class ProjectServiceImpl extends BaseServiceImpl<ProjectDao, ProjectEntit
});
projectStaffService.insertBatch(entityList);
//7:初始化机关-项目时间关联数据
Date current = new Date();
List<String> projectStaffIds = entityList.stream().map(ProjectStaffEntity::getId).distinct().collect(Collectors.toList());
if(!CollectionUtils.isEmpty(projectStaffIds)){
List<ProjectOrgRelationEntity> container = new LinkedList<>();
projectStaffIds.forEach(o -> {
ProjectOrgRelationEntity period = new ProjectOrgRelationEntity();
period.setProjectStaffId(o);
period.setInformedDate(current);
//created
period.setSourceOperation(ProjectConstant.OPERATION_CREATED);
period.setCreatedBy(formDTO.getStaffId());
container.add(period);
});
relationDao.insertBatch(container);
}
//5:项目相关人员表初始数据
List<ProjectRelatedPersonnelEntity> list = new ArrayList<>();
ProjectRelatedPersonnelEntity entity1 = new ProjectRelatedPersonnelEntity();
@ -660,6 +782,8 @@ public class ProjectServiceImpl extends BaseServiceImpl<ProjectDao, ProjectEntit
issueProjectResultDTO.setProjectId(projectEntity.getId());
issueProjectResultDTO.setOrgName(processEntity.getDepartmentName());
issueProjectResultDTO.setShiftedTime(projectEntity.getCreatedTime());
return issueProjectResultDTO;
}
@ -671,7 +795,6 @@ public class ProjectServiceImpl extends BaseServiceImpl<ProjectDao, ProjectEntit
**/
@Override
public List<LatestListResultDTO> getClosedProjectList(LatestListFormDTO formDTO) {
return baseDao.selectClosedProjectList(formDTO);
}
@ -699,17 +822,390 @@ public class ProjectServiceImpl extends BaseServiceImpl<ProjectDao, ProjectEntit
if (ProjectConstant.CLOSED.equals(projectEntity.getStatus())) {
throw new RenException(EpmetErrorCode.PROJECT_IS_CLOSED.getCode());
}
ProjectStaffDTO projectStaff = projectStaffService.getLatestIdByProjectIdAndStaffId(formDTO.getProjectId(),formDTO.getUserId());
if(null == projectStaff){
log.error("com.epmet.service.impl.ProjectServiceImpl.response,project_staff表中没有与之对应的数据,传参:{}", JSON.toJSONString(formDTO));
throw new RenException("未找到项目相关人员记录");
}
if(StringUtils.isBlank(formDTO.getProjectStaffId())){
formDTO.setProjectStaffId(projectStaff.getId());
}
//处理响应记录加入项目进展表
ProjectProcessEntity projectProcessEntity = new ProjectProcessEntity();
projectProcessEntity.setProjectId(formDTO.getProjectId());
projectEntity.setCustomerId(projectStaff.getCustomerId());
projectProcessEntity.setDepartmentName(formDTO.getDepartmentName());
projectProcessEntity.setOrgIdPath(projectStaff.getOrgIdPath());
projectProcessEntity.setGridId(projectStaff.getGridId());
projectProcessEntity.setDepartmentId(projectStaff.getDepartmentId());
projectProcessEntity.setAgencyId(projectStaff.getOrgId());
projectProcessEntity.setOperation(ProjectConstant.OPERATION_RESPONSES);
projectProcessEntity.setOperationName(ProjectConstant.OPERATION_RESPONSES_NAME);
projectProcessEntity.setPublicReply(formDTO.getPublicReply());
projectProcessEntity.setInternalRemark(formDTO.getInternalRemark());
projectProcessEntity.setStaffId(formDTO.getUserId());
projectProcessService.insert(projectProcessEntity);
//项目节点历时
ProjectOrgRelationEntity relationEntity = relationDao.selectByProjectStaffId(formDTO.getProjectStaffId());
if(null != relationEntity){
ProjectOrgRelationEntity relationDto = new ProjectOrgRelationEntity();
relationDto.setProjectStaffId(relationEntity.getProjectStaffId());
if(null == relationEntity.getFirstDealtDate()){
Date current = new Date();
relationDto.setFirstDealtDate(current);
relationDto.setFirstReplyPeriod(calculateDelta_T(ProjectConstant.IMPRECISE_CALCULATION,
ProjectConstant.CALCULATION_TYPE_DEFAULT,projectStaff.getId(),
relationEntity.getInformedDate(),current));
relationDto.setOperation(ProjectConstant.OPERATION_RESPONSES);
relationDao.maintainTimePropertyConsistency(relationDto);
}
}else{
log.error("com.epmet.service.impl.ProjectServiceImpl#response,没有找到相关的节点耗时记录,参数:{}",JSON.toJSONString(formDTO));
throw new RenException("没有找到相关的节点耗时记录");
}
}
private Integer calculateDelta_T(String ifPrecise,String ifCustom,String identity,Date left,Date right){
WorkMinuteFormDTO timeParam = new WorkMinuteFormDTO();
timeParam.setIfPrecise(ifPrecise);
timeParam.setIfCustom(ifCustom);
TimestampIntervalFormDTO interval = new TimestampIntervalFormDTO(identity,left,right);
List<TimestampIntervalFormDTO> intervalList = new LinkedList<>();intervalList.add(interval);
timeParam.setTimeList(intervalList);
Result<Map<String,Integer>> timeResult = epmetCommonServiceOpenFeignClient.workMinutes(timeParam);
if(timeResult.success() && !org.springframework.util.CollectionUtils.isEmpty(timeResult.getData()) && null != timeResult.getData().get(identity)){
return timeResult.getData().get(identity);
}else{
log.error("com.epmet.service.impl.ProjectServiceImpl.response,计算首次响应时间失败");
throw new RenException("计算首次响应时间失败");
}
}
private Map<String,Integer> batchCalculateDelta_T(String ifPrecise,String ifCustom,List<TimestampIntervalFormDTO> intervalList){
WorkMinuteFormDTO timeParam = new WorkMinuteFormDTO();
timeParam.setIfPrecise(ifPrecise);
timeParam.setIfCustom(ifCustom);
timeParam.setTimeList(intervalList);
Result<Map<String,Integer>> timeResult = epmetCommonServiceOpenFeignClient.workMinutes(timeParam);
if(timeResult.success() && !org.springframework.util.CollectionUtils.isEmpty(timeResult.getData())){
return timeResult.getData();
}else{
log.error("com.epmet.service.impl.ProjectServiceImpl.response,计算首次响应时间失败");
throw new RenException("计算首次响应时间失败");
}
}
/**
* 项目滞留超期提醒
*
* @param customerId
* @return void
* @author zhaoqifeng
* @date 2020/10/21 15:21
*/
@Override
public void sendMessage(String customerId) {
List<CustomerProjectParameterDTO> paramList = parameterService.getParameterByCustomer(customerId);
//可滞留天数
int detentionDays = 5;
//计算方式
String calculation = ParameterKeyConstant.WORK;
//即将超期提醒时间
int remindTime = 0;
//推送时间
String pushTime = "08:00";
if (CollectionUtils.isNotEmpty(paramList)) {
for (CustomerProjectParameterDTO dto : paramList) {
if (ParameterKeyConstant.DETENTION_DAYS.equals(dto.getParameterKey())) {
detentionDays = Integer.parseInt(dto.getParameterValue());
} else if (ParameterKeyConstant.CALCULATION.equals(dto.getParameterKey())) {
calculation = dto.getParameterValue();
} else if (ParameterKeyConstant.REMIND_TIME.equals(dto.getParameterKey())) {
remindTime = Integer.parseInt(dto.getParameterValue());
} else if (ParameterKeyConstant.PUSH_TIME.equals(dto.getParameterKey())) {
pushTime = dto.getParameterValue();
}
}
}
//获取工作人员未处理的节点
List<StaffUnHandledDTO> unHandledList = projectStaffService.getStaffUnHandledList(customerId);
List<CostDayFormDTO> form = unHandledList.stream().map(item -> {
CostDayFormDTO dto = new CostDayFormDTO();
dto.setId(item.getId());
dto.setStaffId(item.getStaffId());
if (null != item.getUpdatedTime()) {
dto.setStartDate(item.getUpdatedTime());
} else {
dto.setStartDate(item.getCreatedTime());
}
dto.setEndDate(new Date());
return dto;
}).collect(Collectors.toList());
List<CostDayResultDTO> costDayList;
if (ParameterKeyConstant.WORK.equals(calculation)) {
//工作日计算
Result<List<CostDayResultDTO>> result = epmetCommonServiceOpenFeignClient.costWorkDays(form);
if (!result.success()) {
throw new RenException(result.getCode(), result.getMsg());
}
costDayList = result.getData();
} else {
//日历日计算
Result<List<CostDayResultDTO>> result = epmetCommonServiceOpenFeignClient.costCalendarDays(form);
if (!result.success()) {
throw new RenException(result.getCode(), result.getMsg());
}
costDayList = result.getData();
}
//即将超期项目
List<StaffUnHandledDTO> overdueList = new ArrayList<>();
//滞留项目
List<StaffUnHandledDTO> delayList = new ArrayList<>();
List<CostDayResultDTO> finalCostDayList = costDayList;
List<OverdueAndDelayDTO> list = new ArrayList<>();
int finalDetentionDays = detentionDays;
int finalRemindTime = remindTime;
unHandledList.forEach(unHandle -> finalCostDayList.stream().filter(cost ->
unHandle.getId().equals(cost.getId())).forEach(item -> {
int diff = finalDetentionDays - item.getDetentionDays();
OverdueAndDelayDTO dto = new OverdueAndDelayDTO();
if (diff < 0) {
dto.setStaffId(unHandle.getStaffId());
list.add(dto);
delayList.add(unHandle);
} else if (diff <= finalRemindTime) {
dto.setStaffId(unHandle.getStaffId());
overdueList.add(unHandle);
list.add(dto);
}
}));
if (CollectionUtils.isNotEmpty(list)) {
setMessage(customerId, overdueList, delayList, list);
}
}
/**
* @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));
Map<String, List<StaffUnHandledDTO>> delayMap = delayList.stream().collect(Collectors.groupingBy(StaffUnHandledDTO::getStaffId));
List<OverdueAndDelayDTO> overdue = overdueMap.entrySet().stream().map(item -> {
OverdueAndDelayDTO dto = new OverdueAndDelayDTO();
dto.setStaffId(item.getKey());
dto.setOverdueList(item.getValue());
return dto;
}).collect(Collectors.toList());
List<OverdueAndDelayDTO> delay = delayMap.entrySet().stream().map(item -> {
OverdueAndDelayDTO dto = new OverdueAndDelayDTO();
dto.setStaffId(item.getKey());
dto.setDelayList(item.getValue());
return dto;
}).collect(Collectors.toList());
list.forEach(dto -> overdue.forEach(item -> {
if (dto.getStaffId().equals(item.getStaffId())) {
dto.setOverdueList(item.getOverdueList());
}
}));
list.forEach(dto -> delay.forEach(item -> {
if (dto.getStaffId().equals(item.getStaffId())) {
dto.setDelayList(item.getDelayList());
}
}));
//通知
List<UserMessageFormDTO> msgList = new ArrayList<>();
list.forEach(dto -> {
String title;
String msg;
if (CollectionUtils.isNotEmpty(dto.getOverdueList()) && CollectionUtils.isNotEmpty(dto.getDelayList())) {
title = String.format(UserMessageConstant.STAY_REMINDER_TITLE_1, dto.getOverdueList().size(), dto.getDelayList().size());
StringBuilder overdueMsg = new StringBuilder();
StringBuilder delayMsg = new StringBuilder();
for (int i = 0; i < dto.getOverdueList().size(); i++) {
overdueMsg.append(i + 1).append(StrConstant.COMMA_ZH).append(dto.getOverdueList().get(i).getTitle()).append("\n");
}
for (int i = 0; i < dto.getDelayList().size(); i++) {
delayMsg.append(i + 1).append(StrConstant.COMMA_ZH).append(dto.getDelayList().get(i).getTitle()).append("\n");
}
msg = String.format(UserMessageConstant.STAY_REMINDER_MSG_1, overdueMsg.toString(), delayMsg.toString());
} else if (CollectionUtils.isNotEmpty(dto.getOverdueList()) && CollectionUtils.isEmpty(dto.getDelayList())) {
title = String.format(UserMessageConstant.STAY_REMINDER_TITLE_2, dto.getOverdueList().size());
StringBuilder overdueMsg = new StringBuilder();
for (int i = 0; i < dto.getOverdueList().size(); i++) {
overdueMsg.append(i + 1).append(StrConstant.COMMA_ZH).append(dto.getOverdueList().get(i).getTitle()).append("\n");
}
msg = String.format(UserMessageConstant.STAY_REMINDER_MSG_2, overdueMsg.toString());
} else {
title = String.format(UserMessageConstant.STAY_REMINDER_TITLE_3, dto.getDelayList().size());
StringBuilder delayMsg = new StringBuilder();
for (int i = 0; i < dto.getDelayList().size(); i++) {
delayMsg.append(i + 1).append(StrConstant.COMMA_ZH).append(dto.getDelayList().get(i).getTitle()).append("\n");
}
msg = String.format(UserMessageConstant.STAY_REMINDER_MSG_3, delayMsg.toString());
}
UserMessageFormDTO messageFormDTO = new UserMessageFormDTO();
messageFormDTO.setCustomerId(customerId);
messageFormDTO.setApp(ProjectConstant.GOV);
messageFormDTO.setGridId(StrConstant.STAR);
messageFormDTO.setUserId(dto.getStaffId());
messageFormDTO.setTitle(title);
messageFormDTO.setMessageContent(msg);
messageFormDTO.setReadFlag(Constant.UNREAD);
msgList.add(messageFormDTO);
});
System.out.println(msgList);
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());
}
}
}

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

@ -30,8 +30,10 @@ 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;
import com.epmet.entity.ProjectStaffEntity;
import com.epmet.feign.GovOrgFeignClient;
import com.epmet.redis.ProjectStaffRedis;
@ -155,4 +157,48 @@ public class ProjectStaffServiceImpl extends BaseServiceImpl<ProjectStaffDao, Pr
return baseDao.selectCreatedProcess(dto);
}
/**
* 获取未做处理的节点
*
* @param customerId
* @return java.util.List<com.epmet.dto.result.StaffUnHandledDTO>
* @author zhaoqifeng
* @date 2020/10/21 16:54
*/
@Override
public List<StaffUnHandledDTO> getStaffUnHandledList(String customerId) {
return baseDao.getStaffUnHandledList(customerId);
}
/***
* @Description 根据项目ID查询项目-人员表的ID
* @param projectId
* @return java.util.List<java.lang.String>
* @author wangc
* @date 2020.10.19 18:00
*/
@Override
public List<String> getIdByProjectId(String projectId) {
return baseDao.selectIdByProjectId(projectId);
}
/**
* @Description 根据项目Id和工作人员Id查找最新的project_staff表的ID
* @param projectId
* @param staffId
* @return com.epmet.dto.ProjectStaffDTO
* @author wangc
* @date 2020.10.21 15:07
*/
@Override
public ProjectStaffDTO getLatestIdByProjectIdAndStaffId(String projectId, String staffId) {
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;

9
epmet-module/gov-project/gov-project-server/src/main/resources/mapper/CustomerProjectParameterDao.xml

@ -26,6 +26,15 @@
and CUSTOMER_ID = #{customerId}
and PARAMETER_KEY = #{parameterKey}
</select>
<select id="getParameterByCustomer" resultType="com.epmet.dto.CustomerProjectParameterDTO">
select
PARAMETER_NAME,
PARAMETER_VALUE
from
customer_project_parameter
where DEL_FLAG = '0'
and CUSTOMER_ID = #{customerId}
</select>
</mapper>

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

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.epmet.dao.ProjectOrgRelationDao">
<resultMap type="com.epmet.entity.ProjectOrgRelationEntity" id="projectOrgRelationMap">
<result property="id" column="ID"/>
<result property="projectStaffId" column="PROJECT_STAFF_ID"/>
<result property="informedDate" column="INFORMED_DATE"/>
<result property="handledDate" column="HANDLED_DATE"/>
<result property="totalPeriod" column="TOTAL_PERIOD"/>
<result property="firstDealtDate" column="FIRST_DEALT_DATE"/>
<result property="firstReplyPeriod" column="FIRST_REPLY_PERIOD"/>
<result property="operation" column="OPERATION"/>
<result property="delFlag" column="DEL_FLAG"/>
<result property="revision" column="REVISION"/>
<result property="createdTime" column="CREATED_TIME"/>
<result property="createdBy" column="CREATED_BY"/>
<result property="updatedTime" column="UPDATED_TIME"/>
<result property="updatedBy" column="UPDATED_BY"/>
</resultMap>
<!-- 维护时间属性的一致性 -->
<update id="maintainTimePropertyConsistency" parameterType="com.epmet.entity.ProjectOrgRelationEntity">
UPDATE
project_org_relation
<set>
<if test="null != firstDealtDate">
FIRST_DEALT_DATE = #{firstDealtDate},
UPDATED_TIME = #{firstDealtDate},
FIRST_REPLY_PERIOD = #{firstReplyPeriod},
</if>
<if test="null != handledDate">
HANDLED_DATE = #{handledDate},
UPDATED_TIME = #{handledDate},
TOTAL_PERIOD = #{totalPeriod},
</if>
OPERATION = #{operation}
</set>
<where>
DEL_FLAG = '0'
AND PROJECT_STAFF_ID = #{projectStaffId}
<if test="null != firstDealtDate">
AND FIRST_DEALT_DATE IS NULL
</if>
</where>
</update>
<!-- 批量插入 -->
<insert id="insertBatch" parameterType="java.util.List">
INSERT INTO project_org_relation(
ID,
PROJECT_STAFF_ID,
INFORMED_DATE,
CREATED_TIME,
UPDATED_TIME,
SOURCE_OPERATION,
CREATED_BY,
UPDATED_BY
) values
<foreach collection="list" item="item" index="index" separator=",">
(
(SELECT REPLACE(UUID(),'-','') as id),
#{item.projectStaffId},
<choose>
<when test="null == item.informedDate">
NOW(),
NOW(),
NOW(),
</when>
<otherwise>
#{item.informedDate},
#{item.informedDate},
#{item.informedDate},
</otherwise>
</choose>
#{item.sourceOperation},
#{item.createdBy},
#{item.createdBy}
)
</foreach>
</insert>
<select id="selectByProjectStaffId" resultType="com.epmet.entity.ProjectOrgRelationEntity">
SELECT
*
FROM
project_org_relation
WHERE
PROJECT_STAFF_ID = #{projectStaffId}
</select>
<select id="selectAllUnhandledProcess" resultType="com.epmet.entity.ProjectOrgRelationEntity">
SELECT
period.*
FROM
project_org_relation period
INNER JOIN project_staff staff ON period.PROJECT_STAFF_ID = staff.ID AND staff.DEL_FLAG = '0' AND staff.PROJECT_ID = #{projectId}
WHERE
period.DEL_FLAG = '0'
AND
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>

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

@ -65,5 +65,114 @@
AND ps.STAFF_ID = #{staffId}
AND IS_HANDLE = 'unhandled'
</select>
<select id="getStaffUnHandledList" resultType="com.epmet.dto.result.StaffUnHandledDTO">
SELECT DISTINCT
ps.ID,
ps.PROJECT_ID,
p.TITLE,
ps.STAFF_ID,
ps.CREATED_TIME,
pp.UPDATED_TIME
FROM
project_staff ps
INNER JOIN project p ON ps.PROJECT_ID = p.ID
AND p.`STATUS` != "closed"
LEFT JOIN (
SELECT
pp.AGENCY_ID,
pp.GRID_ID,
pp.DEPARTMENT_ID,
pp.DEPARTMENT_NAME,
pp.STAFF_ID,
pp.PROJECT_ID,
MAX( pp.CREATED_TIME ) AS "UPDATED_TIME"
FROM
project_process pp
INNER JOIN project p ON pp.PROJECT_ID = p.ID
AND p.`STATUS` != "closed"
WHERE
OPERATION = 'response'
GROUP BY
pp.AGENCY_ID,
pp.GRID_ID,
pp.DEPARTMENT_ID,
pp.DEPARTMENT_NAME,
pp.STAFF_ID,
pp.PROJECT_ID
) pp ON ps.ORG_ID = pp.AGENCY_ID
AND ps.GRID_ID = pp.GRID_ID
AND ps.DEPARTMENT_ID = pp.DEPARTMENT_ID
AND ps.STAFF_ID = pp.STAFF_ID
AND ps.PROJECT_ID = pp.PROJECT_ID
AND ps.DEPARTMENT_NAME = pp.DEPARTMENT_NAME
WHERE
ps.IS_HANDLE = 'unhandled'
AND ps.CUSTOMER_ID = #{customerId}
</select>
<!-- 根据项目ID查询项目-人员表的ID -->
<select id="selectIdByProjectId" resultType="java.lang.String">
SELECT
ID
FROM
project_staff
WHERE
DEL_FLAG = '0'
AND
PROJECT_ID = #{projectId}
</select>
<!-- 根据项目Id和工作人员Id查找最新的project_staff表的ID -->
<select id="selectLatestByProjectIdAndStaffId" resultType="com.epmet.dto.ProjectStaffDTO">
SELECT
*
FROM
project_staff
WHERE
DEL_FLAG = '0'
AND
PROJECT_ID = #{projectId}
AND
STAFF_ID = #{staffId}
AND
IS_HANDLE = 'unhandled'
ORDER BY UPDATED_TIME DESC
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