From d6b18348d6d471be020a0f52e942ef6f9c2aae61 Mon Sep 17 00:00:00 2001 From: jiangyy Date: Wed, 21 Oct 2020 11:12:52 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E9=9A=BE=E7=82=B9=E5=A0=B5=E7=82=B9?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data-report/data-report-server/pom.xml | 5 + .../controller/project/ProjectController.java | 36 +++++- .../datareport/dao/project/ProjectDao.java | 19 +++ .../service/project/ProjectService.java | 22 +++- .../project/impl/ProjectServiceImpl.java | 109 +++++++++++++++++- .../resources/mapper/project/ProjectDao.xml | 35 ++++++ .../com/epmet/dto/form/SubAgencyFormDTO.java | 5 + .../epmet/dto/result/SubListResultDTO.java | 4 + .../epmet/feign/GovOrgOpenFeignClient.java | 9 ++ .../GovOrgOpenFeignClientFallback.java | 5 + .../epmet/controller/AgencyController.java | 1 - .../java/com/epmet/dao/CustomerAgencyDao.java | 2 +- .../epmet/service/impl/AgencyServiceImpl.java | 6 +- .../resources/mapper/CustomerAgencyDao.xml | 5 +- 14 files changed, 250 insertions(+), 13 deletions(-) diff --git a/epmet-module/data-report/data-report-server/pom.xml b/epmet-module/data-report/data-report-server/pom.xml index 3f0c56a777..5cc1d89587 100644 --- a/epmet-module/data-report/data-report-server/pom.xml +++ b/epmet-module/data-report/data-report-server/pom.xml @@ -14,6 +14,11 @@ 4.0.0 + + com.epmet + gov-org-client + 2.0.0 + com.epmet data-report-client diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/project/ProjectController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/project/ProjectController.java index 47a4765288..cd6648151c 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/project/ProjectController.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/project/ProjectController.java @@ -1,12 +1,13 @@ -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.module.project.service.ProjectService; +import com.epmet.datareport.service.project.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; @@ -40,7 +41,7 @@ public class ProjectController { /** * @Author sun - * @Description 数据-项目-获取组织下饼图数据 + * @Description t **/ @PostMapping("summaryinfo") public Result> summaryInfo(@LoginUser TokenDto tokenDto) { @@ -78,4 +79,33 @@ public class ProjectController { return new Result>().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> difficultyRank(@RequestBody DifficultyRankFormDTO param){ + ValidatorUtils.validateEntity(param, DifficultyRankFormDTO.DifficultyRankInternalGroup.class); + return new Result>().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> myNextAgency(@LoginUser TokenDto tokenDto){ + return new Result>().ok(projectService.getMyNextAgency(tokenDto)); + } + + + } diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/project/ProjectDao.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/project/ProjectDao.java index b8920580bf..870c25a6d2 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/project/ProjectDao.java +++ b/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 selectIncrTrendMonthly(@Param("agencyId") String agencyId); + + /** + * @Description 查询难点赌点-耗时最长|涉及部门最多|处理次数 + * @param + * @return + * @author jiangyy + * @date 2020.10.19 16:38 + **/ + List difficultyRank(DifficultyRankFormDTO difficultyRankFormDTO); + + /** + * @Description 查询难点堵点的图片list + * @param + * @return + * @author jiangyy + * @date 2020.10.20 10:13 + **/ + List getDifficultyImgList(String eventId); } diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/project/ProjectService.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/project/ProjectService.java index baa6e664e0..a51d157689 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/project/ProjectService.java +++ b/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.project.dto.form.ProjectIncrTrendFormDTO; import com.epmet.project.dto.result.*; @@ -41,4 +42,23 @@ public interface ProjectService { * @Description 数据-项目-日/月数据查询 **/ List 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 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 getMyNextAgency(TokenDto tokenDto); } diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/project/impl/ProjectServiceImpl.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/project/impl/ProjectServiceImpl.java index 41af9351ac..376ac9ffad 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/project/impl/ProjectServiceImpl.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/project/impl/ProjectServiceImpl.java @@ -1,16 +1,26 @@ 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.DateUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.constant.DataSourceConstant; import com.epmet.datareport.dao.project.ProjectDao; +import com.epmet.dto.CustomerAgencyDTO; import com.epmet.dto.form.LoginUserDetailsFormDTO; +import com.epmet.dto.form.SubAgencyFormDTO; +import com.epmet.dto.result.GridByStaffResultDTO; import com.epmet.dto.result.LoginUserDetailsResultDTO; +import com.epmet.dto.result.SubAgencyResultDTO; +import com.epmet.dto.result.SubListResultDTO; import com.epmet.feign.EpmetUserOpenFeignClient; -import com.epmet.module.project.service.ProjectService; +import com.epmet.feign.GovOrgOpenFeignClient; +import com.epmet.datareport.service.project.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; @@ -36,6 +46,9 @@ public class ProjectServiceImpl implements ProjectService { @Autowired private EpmetUserOpenFeignClient epmetUserOpenFeignClient; + @Autowired + private GovOrgOpenFeignClient govOrgOpenFeignClient; + /** * @Author sun * @Description 数据-项目-获取汇总数据 @@ -183,4 +196,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 getMyNextAgency(TokenDto tokenDto) { + List resultList = new ArrayList<>(); + + //1、根据token获取本级agencyId、获取userId + String agencyId = getLoginUserDetails(tokenDto); + String userId=getLoginUserUserId(tokenDto); + + //2、获取本级组织机构 + Result 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> gridListResult = govOrgOpenFeignClient.listGridsbystaffid(userId); + List gridList = gridListResult.getData(); + for(int i=0;i SubAgencyResultDTO = govOrgOpenFeignClient.subAgencyList(form); + + List subAgencyList = SubAgencyResultDTO.getData().getAgencyList(); + for(int i=0;i(); + 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 getDifficultyRank(DifficultyRankFormDTO param) { + List result = projectDao.difficultyRank(param); + for (int i = 0; i < result.size (); i ++){ + List imgUrlList ; + imgUrlList = projectDao.getDifficultyImgList(result.get(i).getProjectId()) ; + + result.get(i).setImgUrlList(imgUrlList); + } + if(null == result) return new ArrayList<>(); + return result; + } + } diff --git a/epmet-module/data-report/data-report-server/src/main/resources/mapper/project/ProjectDao.xml b/epmet-module/data-report/data-report-server/src/main/resources/mapper/project/ProjectDao.xml index 21b472e4de..04fa7f0d4f 100644 --- a/epmet-module/data-report/data-report-server/src/main/resources/mapper/project/ProjectDao.xml +++ b/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 + + + + + \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/SubAgencyFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/SubAgencyFormDTO.java index 6cdf21a193..ce80929e97 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/SubAgencyFormDTO.java +++ b/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; + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/SubListResultDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/SubListResultDTO.java index 17dc985695..b6bf347332 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/SubListResultDTO.java +++ b/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 = ""; } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java index 2ebce80475..2856183dd3 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java +++ b/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 userInfoExt(@RequestBody ExtUserInfoResultDTO result); + + /** + * @param formDTO + * @return + * @Author sun + * @Description 组织首页-下级机关列表 + */ + @PostMapping("/gov/org/agency/subagencylist") + Result subAgencyList(@RequestBody SubAgencyFormDTO formDTO); } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java index 8f70da4530..b132ebec6a 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java +++ b/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 userInfoExt(ExtUserInfoResultDTO result) { return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "userInfoExt", result); } + + @Override + public Result subAgencyList(SubAgencyFormDTO formDTO) { + return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "subAgencyList", formDTO); + } } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/AgencyController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/AgencyController.java index cb1865ba35..08154a921d 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/AgencyController.java +++ b/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; diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerAgencyDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerAgencyDao.java index eeeecf60db..8c404a53c2 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerAgencyDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerAgencyDao.java @@ -57,7 +57,7 @@ public interface CustomerAgencyDao extends BaseDao { * @Author sun * @Description 组织首页-下级机关列表 **/ - List selectSubAgencyById(@Param("pId") String pId); + List selectSubAgencyById(@Param("pId") String pId, @Param("agencyNum") Integer agencyNum); /** * @param pId diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/AgencyServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/AgencyServiceImpl.java index 826e186d7f..9171f61c9d 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/AgencyServiceImpl.java +++ b/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 agencyList = customerAgencyDao.selectSubAgencyById(formDTO.getAgencyId()); + List 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 subAgencyList(SubAgencyFormDTO formDTO) { SubAgencyResultDTO subAgencyResultDTO = new SubAgencyResultDTO(); //1:根据当前机关Id查询直属下一级机关列表 - List agencyList = customerAgencyDao.selectSubAgencyById(formDTO.getAgencyId()); + List agencyList = customerAgencyDao.selectSubAgencyById(formDTO.getAgencyId(),formDTO.getAgencyNum()); subAgencyResultDTO.setAgencyList(null == agencyList ? new ArrayList() : agencyList); //2:统计下一级机关数 subAgencyResultDTO.setSubAgencyCount(agencyList.size()); diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml index 0721780e09..43ed9bb5e3 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml @@ -62,12 +62,13 @@ + \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml index b2fc15543a..163ad63238 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml +++ b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml @@ -65,5 +65,48 @@ AND ps.STAFF_ID = #{staffId} AND IS_HANDLE = 'unhandled' + \ No newline at end of file From 5a8237f0074e479937a4ec267bc03baa2cf9cbfe Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Fri, 23 Oct 2020 15:22:47 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E8=B6=85=E6=9C=9F?= =?UTF-8?q?=E6=BB=9E=E7=95=99=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epmet-gateway/pom.xml | 7 +- .../com/epmet/dto/form/CostDayFormDTO.java | 5 +- .../epmet/dto/result/CostDayResultDTO.java | 6 + .../EpmetCommonServiceOpenFeignClient.java | 4 +- .../service/impl/WorkDayServiceImpl.java | 11 +- .../epmet/dto/result/OverdueAndDelayDTO.java | 28 ++++ .../epmet/dto/result/StaffUnHandledDTO.java | 6 +- .../gov-project/gov-project-server/pom.xml | 6 + .../epmet/constant/UserMessageConstant.java | 31 +++++ .../epmet/controller/ProjectController.java | 5 + .../service/impl/ProjectServiceImpl.java | 120 ++++++++++++++++-- .../service/impl/ProjectStaffServiceImpl.java | 2 +- .../main/resources/mapper/ProjectStaffDao.xml | 3 +- 13 files changed, 210 insertions(+), 24 deletions(-) create mode 100644 epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/OverdueAndDelayDTO.java diff --git a/epmet-gateway/pom.xml b/epmet-gateway/pom.xml index b8157a9836..8b46ae7845 100644 --- a/epmet-gateway/pom.xml +++ b/epmet-gateway/pom.xml @@ -288,10 +288,11 @@ lb://gov-issue-server - - lb://gov-project-server + http://localhost:8102 + - lb://common-service-server + + http://localhost:8103 lb://resi-home-server diff --git a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/form/CostDayFormDTO.java b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/form/CostDayFormDTO.java index 5c1c27395a..487a596d09 100644 --- a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/form/CostDayFormDTO.java +++ b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/form/CostDayFormDTO.java @@ -3,6 +3,7 @@ package com.epmet.dto.form; import lombok.Data; import java.io.Serializable; +import java.util.Date; /** * @author zhaoqifeng @@ -25,10 +26,10 @@ public class CostDayFormDTO implements Serializable { /** * 起始日期 */ - private String startDate; + private Date startDate; /** * 终止日期 */ - private String endDate; + private Date endDate; } diff --git a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/result/CostDayResultDTO.java b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/result/CostDayResultDTO.java index 27074d8c8f..7087768d4b 100644 --- a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/result/CostDayResultDTO.java +++ b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/result/CostDayResultDTO.java @@ -3,6 +3,7 @@ package com.epmet.dto.result; import lombok.Data; import java.io.Serializable; +import java.util.Date; /** * @author zhaoqifeng @@ -27,5 +28,10 @@ public class CostDayResultDTO implements Serializable { */ private Integer detentionDays; + /** + * 起始日期 + */ + private Date startDate; + } diff --git a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/EpmetCommonServiceOpenFeignClient.java b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/EpmetCommonServiceOpenFeignClient.java index 7b718fb2e3..eac60c806a 100644 --- a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/EpmetCommonServiceOpenFeignClient.java +++ b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/EpmetCommonServiceOpenFeignClient.java @@ -21,8 +21,8 @@ import java.util.List; * @author yinzuomei@elink-cn.com * @date 2020/6/4 10:28 */ -@FeignClient(name = ServiceConstant.EPMET_COMMON_SERVICE, fallback = EpmetCommonServiceOpenFeignClientFallback.class) -//@FeignClient(name = ServiceConstant.EPMET_COMMON_SERVICE, fallback = EpmetCommonServiceOpenFeignClientFallback.class, url = "http://localhost:8103") +//@FeignClient(name = ServiceConstant.EPMET_COMMON_SERVICE, fallback = EpmetCommonServiceOpenFeignClientFallback.class) +@FeignClient(name = ServiceConstant.EPMET_COMMON_SERVICE, fallback = EpmetCommonServiceOpenFeignClientFallback.class, url = "http://localhost:8103") public interface EpmetCommonServiceOpenFeignClient { /** * @param formDTO diff --git a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/impl/WorkDayServiceImpl.java b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/impl/WorkDayServiceImpl.java index 8a15b3b0f3..9830aeee1a 100644 --- a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/impl/WorkDayServiceImpl.java +++ b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/impl/WorkDayServiceImpl.java @@ -1,6 +1,7 @@ package com.epmet.service.impl; import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.utils.DateUtils; import com.epmet.dao.CalenderDao; import com.epmet.dto.form.CostDayFormDTO; import com.epmet.dto.form.WorkDayFormDTO; @@ -65,6 +66,7 @@ public class WorkDayServiceImpl implements WorkDayService { 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; @@ -89,6 +91,7 @@ public class WorkDayServiceImpl implements WorkDayService { 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; @@ -128,7 +131,9 @@ public class WorkDayServiceImpl implements WorkDayService { } - private Integer getWorkDays(String startDateStr, String endDateStr) { + 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; @@ -158,7 +163,9 @@ public class WorkDayServiceImpl implements WorkDayService { } - private Integer getCalendarDays(String startDateStr, String endDateStr) { + 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; diff --git a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/OverdueAndDelayDTO.java b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/OverdueAndDelayDTO.java new file mode 100644 index 0000000000..93434edacc --- /dev/null +++ b/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 overdueList; + /** + * 滞留 + */ + private List delayList; +} diff --git a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/StaffUnHandledDTO.java b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/StaffUnHandledDTO.java index 1a2c4e0971..7f19ab6754 100644 --- a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/StaffUnHandledDTO.java +++ b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/StaffUnHandledDTO.java @@ -14,9 +14,13 @@ import java.util.Date; public class StaffUnHandledDTO implements Serializable { private static final long serialVersionUID = 5257146338113364709L; /** - * 项目ID + * project_staff ID */ private String id; + /** + * 项目ID + */ + private String projectId; /** * 项目标题 */ diff --git a/epmet-module/gov-project/gov-project-server/pom.xml b/epmet-module/gov-project/gov-project-server/pom.xml index 1d80b96d6b..25c9ca4e29 100644 --- a/epmet-module/gov-project/gov-project-server/pom.xml +++ b/epmet-module/gov-project/gov-project-server/pom.xml @@ -54,6 +54,12 @@ com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config + + org.apache.commons + commons-collections4 + 4.3 + compile + io.github.openfeign diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/UserMessageConstant.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/UserMessageConstant.java index 756a599ac3..9b0882e2cf 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/UserMessageConstant.java +++ b/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"; + } diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/ProjectController.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/ProjectController.java index 5ccc25b279..0d500784db 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/ProjectController.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/ProjectController.java @@ -151,5 +151,10 @@ public class ProjectController { List result = projectService.getPendProjectList(fromDTO); return new Result>().ok(result); } + @PostMapping("message") + public Result sendMessage(@RequestBody ProjectDTO formDTO) { + projectService.sendMessage(formDTO.getCustomerId()); + return new Result(); + } } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java index f6eeccd013..ed8bff2d21 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java @@ -20,10 +20,7 @@ package com.epmet.service.impl; 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; @@ -48,6 +45,7 @@ import com.epmet.entity.ProjectStaffEntity; import com.epmet.feign.*; import com.epmet.redis.ProjectRedis; import com.epmet.service.*; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -732,7 +730,7 @@ public class ProjectServiceImpl extends BaseServiceImpl NumConstant.ZERO) { + if (CollectionUtils.isNotEmpty(paramList)) { for (CustomerProjectParameterDTO dto : paramList) { if (ParameterKeyConstant.DETENTION_DAYS.equals(dto.getParameterKey())) { detentionDays = Integer.parseInt(dto.getParameterValue()); @@ -748,35 +746,133 @@ public class ProjectServiceImpl extends BaseServiceImpl unHandledList = projectStaffService.getStaffUnHandledList(customerId); - List formDTOS = unHandledList.stream().map(item -> { + List form = unHandledList.stream().map(item -> { CostDayFormDTO dto = new CostDayFormDTO(); dto.setId(item.getId()); dto.setStaffId(item.getStaffId()); if (null != item.getUpdatedTime()) { - dto.setStartDate(DateUtils.format(item.getUpdatedTime(), DateUtils.DATE_PATTERN_YYYYMMDD)); + dto.setStartDate(item.getUpdatedTime()); } else { - dto.setStartDate(DateUtils.format(item.getCreatedTime(), DateUtils.DATE_PATTERN_YYYYMMDD)); + dto.setStartDate(item.getCreatedTime()); } - dto.setEndDate(DateUtils.format(new Date(), DateUtils.DATE_PATTERN_YYYYMMDD)); + dto.setEndDate(new Date()); return dto; }).collect(Collectors.toList()); - List costDayList = new ArrayList<>(); + List costDayList; if (ParameterKeyConstant.WORK.equals(calculation)) { //工作日计算 - Result> result = epmetCommonServiceOpenFeignClient.costWorkDays(formDTOS); + Result> result = epmetCommonServiceOpenFeignClient.costWorkDays(form); if (!result.success()) { throw new RenException(result.getCode(), result.getMsg()); } costDayList = result.getData(); } else { //日历日计算 - Result> result = epmetCommonServiceOpenFeignClient.costCalendarDays(formDTOS); + Result> result = epmetCommonServiceOpenFeignClient.costCalendarDays(form); if (!result.success()) { throw new RenException(result.getCode(), result.getMsg()); } costDayList = result.getData(); } + //即将超期项目 + List overdueList = new ArrayList<>(); + //滞留项目 + List delayList = new ArrayList<>(); + List finalCostDayList = costDayList; + List 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); + } + } + private void setMessage(String customerId, List overdueList, List delayList, List list) { + list = list.stream().distinct().collect(Collectors.toList()); + Map> overdueMap = overdueList.stream().collect(Collectors.groupingBy(StaffUnHandledDTO::getStaffId)); + Map> delayMap = delayList.stream().collect(Collectors.groupingBy(StaffUnHandledDTO::getStaffId)); + + List overdue = overdueMap.entrySet().stream().map(item -> { + OverdueAndDelayDTO dto = new OverdueAndDelayDTO(); + dto.setStaffId(item.getKey()); + dto.setOverdueList(item.getValue()); + return dto; + }).collect(Collectors.toList()); + List 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 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); } } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectStaffServiceImpl.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectStaffServiceImpl.java index 7285388e35..4411a870fa 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectStaffServiceImpl.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectStaffServiceImpl.java @@ -166,7 +166,7 @@ public class ProjectStaffServiceImpl extends BaseServiceImpl getStaffUnHandledList(String customerId) { - return null; + return baseDao.getStaffUnHandledList(customerId); } } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml index 163ad63238..6435a5df80 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml +++ b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml @@ -67,7 +67,8 @@ 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)) 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 + + + + + + + + + + + + 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 + + ( + (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' + ) + + + \ No newline at end of file diff --git a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/form/TimestampIntervalFormDTO.java b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/form/TimestampIntervalFormDTO.java new file mode 100644 index 0000000000..0a30dd2378 --- /dev/null +++ b/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; + +} diff --git a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/form/WorkMinuteFormDTO.java b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/form/WorkMinuteFormDTO.java new file mode 100644 index 0000000000..fe4ecd5868 --- /dev/null +++ b/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 timeList; +} diff --git a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/EpmetCommonServiceOpenFeignClient.java b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/EpmetCommonServiceOpenFeignClient.java index 7b718fb2e3..23a5e04e56 100644 --- a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/EpmetCommonServiceOpenFeignClient.java +++ b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/EpmetCommonServiceOpenFeignClient.java @@ -6,6 +6,7 @@ import com.epmet.dto.form.CostDayFormDTO; import com.epmet.dto.form.ExternalAppAuthFormDTO; import com.epmet.dto.form.WorkDayFormDTO; import com.epmet.dto.result.CostDayResultDTO; +import com.epmet.dto.form.WorkMinuteFormDTO; import com.epmet.dto.result.ExternalAppAuthResultDTO; import com.epmet.dto.result.WorkDayResultDTO; import com.epmet.feign.fallback.EpmetCommonServiceOpenFeignClientFallback; @@ -14,6 +15,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调用该服务 @@ -21,8 +23,8 @@ import java.util.List; * @author yinzuomei@elink-cn.com * @date 2020/6/4 10:28 */ -@FeignClient(name = ServiceConstant.EPMET_COMMON_SERVICE, fallback = EpmetCommonServiceOpenFeignClientFallback.class) -//@FeignClient(name = ServiceConstant.EPMET_COMMON_SERVICE, fallback = EpmetCommonServiceOpenFeignClientFallback.class, url = "http://localhost:8103") +//@FeignClient(name = ServiceConstant.EPMET_COMMON_SERVICE, fallback = EpmetCommonServiceOpenFeignClientFallback.class) +@FeignClient(name = ServiceConstant.EPMET_COMMON_SERVICE, fallback = EpmetCommonServiceOpenFeignClientFallback.class, url = "http://localhost:8103") public interface EpmetCommonServiceOpenFeignClient { /** * @param formDTO @@ -75,4 +77,14 @@ public interface EpmetCommonServiceOpenFeignClient { */ @PostMapping("commonservice/workday/calendardays") Result> costCalendarDays(@RequestBody List formDTO); + + /** + * @Description 计算经历的多少分钟(只计算工作日) + * @param param + * @return com.epmet.commons.tools.utils.Result> + * @author wangc + * @date 2020.10.21 16:34 + */ + @PostMapping("commonservice/workday/workminutes") + Result> workMinutes(@RequestBody WorkMinuteFormDTO param); } diff --git a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/fallback/EpmetCommonServiceOpenFeignClientFallback.java b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/fallback/EpmetCommonServiceOpenFeignClientFallback.java index 8fb21a626d..1da180368d 100644 --- a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/fallback/EpmetCommonServiceOpenFeignClientFallback.java +++ b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/fallback/EpmetCommonServiceOpenFeignClientFallback.java @@ -6,6 +6,7 @@ import com.epmet.commons.tools.utils.Result; import com.epmet.dto.form.CostDayFormDTO; import com.epmet.dto.form.ExternalAppAuthFormDTO; import com.epmet.dto.form.WorkDayFormDTO; +import com.epmet.dto.form.WorkMinuteFormDTO; import com.epmet.dto.result.CostDayResultDTO; import com.epmet.dto.result.ExternalAppAuthResultDTO; import com.epmet.dto.result.WorkDayResultDTO; @@ -13,6 +14,7 @@ import com.epmet.feign.EpmetCommonServiceOpenFeignClient; import org.springframework.stereotype.Component; import java.util.List; +import java.util.Map; /** * 本服务对外开放的API,其他服务通过引用此client调用该服务 @@ -67,4 +69,9 @@ public class EpmetCommonServiceOpenFeignClientFallback implements EpmetCommonSer public Result> costCalendarDays(List formDTO) { return ModuleUtils.feignConError(ServiceConstant.EPMET_COMMON_SERVICE, "costCalendarDays", formDTO); } + + @Override + public Result> workMinutes(WorkMinuteFormDTO param) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_COMMON_SERVICE, "workMinutes", param); + } } diff --git a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/constant/ProjectConstant.java b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/constant/ProjectConstant.java index 8aa3dc2fc1..bf40e30351 100644 --- a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/constant/ProjectConstant.java +++ b/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"; } diff --git a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/controller/WorkDayController.java b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/controller/WorkDayController.java index 06c41ca828..abfd449ef3 100644 --- a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/controller/WorkDayController.java +++ b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/controller/WorkDayController.java @@ -4,6 +4,7 @@ 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; @@ -13,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 工作日计算 @@ -66,5 +68,17 @@ public class WorkDayController { return new Result>().ok(list); } + + /** + * @Description 计算经历的多少分钟(只计算工作日) + * @param param + * @return com.epmet.commons.tools.utils.Result> + * @author wangc + * @date 2020.10.21 16:34 + */ + @PostMapping("workminutes") + public Result> workMinutes(@RequestBody WorkMinuteFormDTO param){ + return new Result>().ok(workDayService.workMinutes(param)); + } } diff --git a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/WorkDayService.java b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/WorkDayService.java index 8dfdb24c4f..8d4e4673cc 100644 --- a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/WorkDayService.java +++ b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/WorkDayService.java @@ -3,9 +3,12 @@ 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; /** @@ -33,4 +36,13 @@ public interface WorkDayService { * @return java.util.List */ List costCalendarDays(List formDTO); + + /** + * @Description 计算经历的多少分钟(只计算工作日) + * @param param + * @return java.util.Map + * @author wangc + * @date 2020.10.21 16:14 + */ + Map workMinutes(WorkMinuteFormDTO param); } diff --git a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/impl/WorkDayServiceImpl.java b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/impl/WorkDayServiceImpl.java index 9830aeee1a..80241a5a2e 100644 --- a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/impl/WorkDayServiceImpl.java +++ b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/impl/WorkDayServiceImpl.java @@ -1,20 +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.*; /** @@ -28,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 detentionDays(List workDayFormDTO) { List list = new ArrayList<>(); @@ -97,6 +109,45 @@ public class WorkDayServiceImpl implements WorkDayService { return list; } + /** + * @Description 计算经历的多少分钟(只计算工作日) + * @param param + * @return java.util.Map + * @author wangc + * @date 2020.10.21 16:14 + */ + @Override + public Map workMinutes(WorkMinuteFormDTO param) { + List params = param.getTimeList(); + if(CollectionUtils.isEmpty(params)) return null; + Map 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)) { @@ -130,6 +181,197 @@ 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 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 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 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); diff --git a/epmet-module/epmet-common-service/common-service-server/src/main/resources/mapper/CalenderDao.xml b/epmet-module/epmet-common-service/common-service-server/src/main/resources/mapper/CalenderDao.xml index b1a3ab8e8d..13a7758445 100644 --- a/epmet-module/epmet-common-service/common-service-server/src/main/resources/mapper/CalenderDao.xml +++ b/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} + \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/ProjectOrgRelationDTO.java b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/ProjectOrgRelationDTO.java new file mode 100644 index 0000000000..a092793cf2 --- /dev/null +++ b/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 + *

+ * 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. + *

+ * 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. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +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_ID、CUSTOMER_ID、PROCESS_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; + +} \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/ProjectProcessDTO.java b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/ProjectProcessDTO.java index 4a0e30f907..689b3317d1 100644 --- a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/ProjectProcessDTO.java +++ b/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; + } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/ProjectConstant.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/ProjectConstant.java index dd0f37c086..fb70cb2906 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/ProjectConstant.java +++ b/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"; } diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectOrgRelationDao.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectOrgRelationDao.java new file mode 100644 index 0000000000..146d58cc04 --- /dev/null +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectOrgRelationDao.java @@ -0,0 +1,73 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

+ * 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. + *

+ * 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. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +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 { + + /*** + * @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 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 + * @author wangc + * @date 2020.10.22 13:37 + */ + List selectAllUnhandledProcess(@Param("projectId")String projectId); + +} \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectStaffDao.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectStaffDao.java index 37613ce615..244ae3e56d 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectStaffDao.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectStaffDao.java @@ -89,4 +89,23 @@ public interface ProjectStaffDao extends BaseDao { * @return java.util.List */ List getStaffUnHandledList(@Param("customerId") String customerId); + + /*** + * @Description 根据项目ID查询项目-人员表的ID + * @param projectId + * @return java.util.List + * @author wangc + * @date 2020.10.19 18:00 + */ + List 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); } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/ProjectOrgRelationEntity.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/ProjectOrgRelationEntity.java new file mode 100644 index 0000000000..23e190ab90 --- /dev/null +++ b/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 + *

+ * 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. + *

+ * 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. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +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_ID、CUSTOMER_ID、PROCESS_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; + +} diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/ProjectProcessEntity.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/ProjectProcessEntity.java index e9ae924698..a862140529 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/ProjectProcessEntity.java +++ b/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; + } diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectStaffService.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectStaffService.java index c15d36304a..386a92e61f 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectStaffService.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectStaffService.java @@ -150,4 +150,23 @@ public interface ProjectStaffService extends BaseService { * @return java.util.List */ List getStaffUnHandledList(String customerId); + + /*** + * @Description 根据项目ID查询项目-人员表的ID + * @param projectId + * @return java.util.List + * @author wangc + * @date 2020.10.19 18:00 + */ + List 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); } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java index 8c8a2dc776..4b965badfa 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java +++ b/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; @@ -35,25 +36,30 @@ import com.epmet.commons.tools.utils.ScanContentUtils; import com.epmet.constant.ProjectConstant; import com.epmet.constant.ReadFlagConstant; import com.epmet.constant.UserMessageConstant; +import com.epmet.dao.ProjectOrgRelationDao; import com.epmet.dao.ProjectProcessDao; import com.epmet.dao.ProjectStaffDao; import com.epmet.dto.ProjectProcessDTO; 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.GovOrgFeignClient; 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; @@ -65,6 +71,7 @@ import java.util.stream.Collectors; * @since v1.0.0 2020-05-11 */ @Service +@Slf4j public class ProjectProcessServiceImpl extends BaseServiceImpl implements ProjectProcessService { @Autowired @@ -83,6 +90,10 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl staffList = formDTO.getStaffList(); @@ -276,6 +293,48 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl intervalList = new LinkedList<>();intervalList.add(interval); + timeParam.setTimeList(intervalList); + Result> 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 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); diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java index ed8bff2d21..5ae016bb5e 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.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; @@ -28,30 +29,29 @@ import com.epmet.commons.tools.scan.param.TextScanParamDTO; import com.epmet.commons.tools.scan.param.TextTaskDTO; import com.epmet.commons.tools.scan.result.SyncScanResult; import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.utils.DateUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.utils.ScanContentUtils; 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.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.stream.Collectors; @@ -63,6 +63,7 @@ import java.util.stream.Collectors; * @since v1.0.0 2020-05-11 */ @Service +@Slf4j public class ProjectServiceImpl extends BaseServiceImpl implements ProjectService { @Autowired @@ -89,6 +90,8 @@ public class ProjectServiceImpl extends BaseServiceImpl periodsToUpdate = relationDao.selectAllUnhandledProcess(fromDTO.getProjectId()); + //if(CollectionUtils.isEmpty(periodsToUpdate)){ + // log.error("com.epmet.service.impl.ProjectServiceImpl.closed,至少存在一条处理时间为空的项目节点耗时记录,但是没有找到,参数:{}",JSON.toJSONString(fromDTO)); + // throw new RenException("至少存在一条处理时间为空的项目节点耗时记录,但是没有找到"); + //} + + + //List 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 msgList = new ArrayList<>(); //通知项目相关人员 @@ -436,16 +488,30 @@ public class ProjectServiceImpl extends BaseServiceImpl msgList = new ArrayList<>(); UserMessageFormDTO messageFormDTO = new UserMessageFormDTO(); @@ -592,6 +687,7 @@ public class ProjectServiceImpl extends BaseServiceImpl { 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); @@ -642,6 +745,24 @@ public class ProjectServiceImpl extends BaseServiceImpl projectStaffIds = entityList.stream().map(ProjectStaffEntity::getId).distinct().collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(projectStaffIds)){ + List 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 list = new ArrayList<>(); ProjectRelatedPersonnelEntity entity1 = new ProjectRelatedPersonnelEntity(); @@ -659,6 +780,8 @@ public class ProjectServiceImpl extends BaseServiceImpl getClosedProjectList(LatestListFormDTO formDTO) { - return baseDao.selectClosedProjectList(formDTO); } @@ -698,17 +820,81 @@ public class ProjectServiceImpl extends BaseServiceImpl intervalList = new LinkedList<>();intervalList.add(interval); + timeParam.setTimeList(intervalList); + Result> 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 batchCalculateDelta_T(String ifPrecise,String ifCustom,List intervalList){ + WorkMinuteFormDTO timeParam = new WorkMinuteFormDTO(); + timeParam.setIfPrecise(ifPrecise); + timeParam.setIfCustom(ifCustom); + timeParam.setTimeList(intervalList); + Result> 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("计算首次响应时间失败"); + } } /** diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectStaffServiceImpl.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectStaffServiceImpl.java index 4411a870fa..7250b38f63 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectStaffServiceImpl.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectStaffServiceImpl.java @@ -169,4 +169,29 @@ public class ProjectStaffServiceImpl extends BaseServiceImpl + * @author wangc + * @date 2020.10.19 18:00 + */ + @Override + public List 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); + } + } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectOrgRelationDao.xml b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectOrgRelationDao.xml new file mode 100644 index 0000000000..c033280163 --- /dev/null +++ b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectOrgRelationDao.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE + project_org_relation + + + FIRST_DEALT_DATE = #{firstDealtDate}, + UPDATED_TIME = #{firstDealtDate}, + FIRST_REPLY_PERIOD = #{firstReplyPeriod}, + + + HANDLED_DATE = #{handledDate}, + UPDATED_TIME = #{handledDate}, + TOTAL_PERIOD = #{totalPeriod}, + + OPERATION = #{operation} + + + DEL_FLAG = '0' + AND PROJECT_STAFF_ID = #{projectStaffId} + + AND FIRST_DEALT_DATE IS NULL + + + + + + + INSERT INTO project_org_relation( + ID, + PROJECT_STAFF_ID, + INFORMED_DATE, + CREATED_TIME, + UPDATED_TIME, + SOURCE_OPERATION, + CREATED_BY, + UPDATED_BY + ) values + + ( + (SELECT REPLACE(UUID(),'-','') as id), + #{item.projectStaffId}, + + + NOW(), + NOW(), + NOW(), + + + #{item.informedDate}, + #{item.informedDate}, + #{item.informedDate}, + + + + #{item.sourceOperation}, + #{item.createdBy}, + #{item.createdBy} + ) + + + + + + + + \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml index 6435a5df80..126315eb4b 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml +++ b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml @@ -110,4 +110,34 @@ AND ps.CUSTOMER_ID = #{customerId} + + + + + + \ No newline at end of file From 921c52a10b96f4634aebc52057f2f1cf37d3a175 Mon Sep 17 00:00:00 2001 From: wangchao Date: Mon, 26 Oct 2020 14:39:23 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E5=9B=A0=E4=B8=BA=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E6=94=B9=E9=80=A0=E8=80=8C=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E5=B0=86=E5=8E=86=E5=8F=B2=E6=95=B0=E6=8D=AE=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E5=88=B0=E6=96=B0=E8=A1=A8=E7=9A=84=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E4=BB=8Edata-stats=E7=A7=BB=E5=8A=A8=E5=88=B0gov-project?= =?UTF-8?q?=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../result/ProjectOrgPeriodResultDTO.java | 1 - .../com/epmet/controller/DemoController.java | 9 -- .../epmet/dao/project/ProjectProcessDao.java | 9 +- .../screen/ScreenDifficultyDataEntity.java | 5 + .../extract/todata/ProjectExtractService.java | 9 +- .../impl/ProjectExtractServiceImpl.java | 28 +++- .../project/ProjectProcessService.java | 11 +- .../impl/ProjectProcessServiceImpl.java | 110 +------------ .../extract/FactOriginProjectMainDailyDao.xml | 1 + .../screen/ScreenDifficultyDataDao.xml | 2 + .../mapper/project/ProjectProcessDao.xml | 36 ----- .../dto/result/ProjectOrgPeriodResultDTO.java | 96 ++++++++++++ ...ojectOrgRelationWhenResponseResultDTO.java | 49 ++++++ .../epmet/controller/ProjectController.java | 5 + .../main/java/com/epmet/dao/ProjectDao.java | 9 ++ .../com/epmet/dao/ProjectOrgRelationDao.java | 18 +++ .../java/com/epmet/dao/ProjectProcessDao.java | 10 ++ .../java/com/epmet/dao/ProjectStaffDao.java | 12 ++ .../epmet/service/ProjectProcessService.java | 11 +- .../com/epmet/service/ProjectService.java | 10 ++ .../epmet/service/ProjectStaffService.java | 11 ++ .../impl/ProjectProcessServiceImpl.java | 12 ++ .../service/impl/ProjectServiceImpl.java | 147 ++++++++++++++++++ .../service/impl/ProjectStaffServiceImpl.java | 7 + .../resources/db/migration/V0.0.2__period.sql | 100 ++++++++++++ .../mapper/ProjectOrgRelationDao.xml | 45 ++++++ .../resources/mapper/ProjectProcessDao.xml | 24 +++ .../main/resources/mapper/ProjectStaffDao.xml | 35 +++++ 28 files changed, 639 insertions(+), 183 deletions(-) create mode 100644 epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/ProjectOrgPeriodResultDTO.java create mode 100644 epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/ProjectOrgRelationWhenResponseResultDTO.java create mode 100644 epmet-module/gov-project/gov-project-server/src/main/resources/db/migration/V0.0.2__period.sql diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/project/result/ProjectOrgPeriodResultDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/project/result/ProjectOrgPeriodResultDTO.java index b166748d3e..9bbd942efe 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/project/result/ProjectOrgPeriodResultDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/project/result/ProjectOrgPeriodResultDTO.java @@ -7,7 +7,6 @@ import java.util.Date; /** * @Description 从数据库中查询出的 项目 - 机关(网格、部门、机关)的响应时长 - * FIXME 注:查询的全都是已经结案的项目!!!!!!!!!!!!如果查询流转中的项目,需要修改逻辑(较为复杂) * @ClassName ProjectOrgPeriodResultDTO * @Auth wangc * @Date 2020-09-16 15:28 diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java index 5fe3229667..13a418a773 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java @@ -744,13 +744,4 @@ public class DemoController { return new Result(); } - - @Autowired - ProjectExtractService projectExtractService; - - @PostMapping("projectremould") - public Result> projectRemould(@RequestBody ExtractOriginFormDTO param){ - return new Result>().ok(projectExtractService.test(param)); - } - } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/project/ProjectProcessDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/project/ProjectProcessDao.java index b86c551b80..e923a26c70 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/project/ProjectProcessDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/project/ProjectProcessDao.java @@ -154,12 +154,5 @@ public interface ProjectProcessDao extends BaseDao { */ List selectLatestOperation(@Param("list") List list); - /** - * @Description 批量插入节点耗时数据(数据补齐) - * @param list - * @return int - * @author wangc - * @date 2020.10.26 09:59 - */ - int batchInsertProjectOrgRelation(@Param("list") List list); + } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenDifficultyDataEntity.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenDifficultyDataEntity.java index 35f4ca3ee4..f8f7595adf 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenDifficultyDataEntity.java +++ b/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; + /** * 事件耗时 单位:分钟 */ diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/ProjectExtractService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/ProjectExtractService.java index 9d2a27effb..9b7b5e35fe 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/ProjectExtractService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/ProjectExtractService.java @@ -33,5 +33,12 @@ public interface ProjectExtractService { **/ void extractProjectPeriodData(ExtractOriginFormDTO param); - List test(ExtractOriginFormDTO param); + /** + * @Description 项目节点耗时数据补齐 + * @param + * @return java.util.List + * @author wangc + * @date 2020.10.26 10:18 + */ + void projectProcessCostTimeDataCompensation(); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/ProjectExtractServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/ProjectExtractServiceImpl.java index 228f9b8fb5..5f4220162b 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/ProjectExtractServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/ProjectExtractServiceImpl.java @@ -14,6 +14,7 @@ import com.epmet.dto.issue.IssueDTO; import com.epmet.dto.party.PartyMemberDTO; import com.epmet.dto.project.FinishOrgDTO; import com.epmet.dto.project.ProcessInfoDTO; +import com.epmet.dto.project.ProjectOrgRelationDTO; import com.epmet.dto.project.result.ProjectOrgPeriodResultDTO; import com.epmet.dto.result.WorkDayResultDTO; import com.epmet.dto.topic.ResiTopicDTO; @@ -29,6 +30,7 @@ import com.epmet.service.evaluationindex.extract.todata.ProjectExtractService; import com.epmet.service.partymember.PartyMemberService; import com.epmet.service.project.ProjectProcessService; import com.epmet.service.project.ProjectService; +import com.epmet.service.stats.DimCustomerService; import com.epmet.service.topic.TopicService; import com.epmet.util.DimIdGenerator; import lombok.extern.slf4j.Slf4j; @@ -38,10 +40,8 @@ import org.springframework.stereotype.Service; import org.apache.commons.collections4.CollectionUtils; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; +import java.util.*; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -71,6 +71,8 @@ public class ProjectExtractServiceImpl implements ProjectExtractService { private EpmetCommonServiceOpenFeignClient epmetCommonServiceOpenFeignClient; @Autowired private FactOriginProjectOrgPeriodDailyDao factOriginProjectOrgPeriodDailyDao; + @Autowired + private DimCustomerService dimCustomerService; private final static String ONE_DAY = "<1"; @@ -444,15 +446,25 @@ public class ProjectExtractServiceImpl implements ProjectExtractService { } } + /** + * @Description 项目节点耗时数据补齐 + * @param + * @return java.util.List + * @author wangc + * @date 2020.10.26 10:18 + */ @Override - public List test(ExtractOriginFormDTO param) { + public void projectProcessCostTimeDataCompensation() { + + List customers = dimCustomerService.getAllCustomerId(); + if(CollectionUtils.isEmpty(customers)) return ; + customers.forEach(local -> { + // projectProcessService.getProjectPeriod(true, local,null); + }); - List extractData = - projectProcessService.getProjectPeriod(true, param.getCustomerId(), param.getDateId()); System.out.println("-------------EndPointHere----------------"); - return extractData; } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/ProjectProcessService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/ProjectProcessService.java index 6b80b31bd3..48bd2488ee 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/ProjectProcessService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/ProjectProcessService.java @@ -93,16 +93,7 @@ public interface ProjectProcessService extends BaseService */ List getClosedProjectList(String customerId, String date); - /** - * @Description 查询各机关项目节点历时 - * @param isFirst 是否首次 - * @param customerId - * @param date - * @return - * @author wangc - * @date 2020.09.18 13:38 - **/ - List getProjectPeriod(Boolean isFirst,String customerId,String date); + /** * @Description 直接从项目业务改造获取项目节点耗时信息 diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java index b3d053c158..23dc8128ba 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java @@ -20,11 +20,13 @@ package com.epmet.service.project.impl; import com.epmet.commons.dynamic.datasource.annotation.DataSource; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.constant.DataSourceConstant; import com.epmet.dao.project.ProjectProcessDao; import com.epmet.dto.form.CommonStaffIdFormDTO; import com.epmet.dto.project.FinishOrgDTO; import com.epmet.dto.project.ProcessInfoDTO; +import com.epmet.dto.project.ProjectOrgRelationDTO; import com.epmet.dto.project.result.ProjectLatestOperationResultDTO; import com.epmet.dto.project.result.ProjectOrgPeriodResultDTO; import com.epmet.dto.project.result.ProjectOrgRelationWhenResponseResultDTO; @@ -86,45 +88,6 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl getProjectPeriod(Boolean isFirst,String customerId, String date) { - List projectNodePeriodPerOrgList; - if(isFirst){ - projectNodePeriodPerOrgList = baseDao.selectProjectOrgPeriod(customerId,null,null); - }else{ - projectNodePeriodPerOrgList = baseDao.selectProjectOrgPeriod(customerId,null,date); - } - - if(!CollectionUtils.isEmpty(projectNodePeriodPerOrgList)){ - - Map> projectMap - = projectNodePeriodPerOrgList.stream().collect(Collectors.groupingBy(ProjectOrgPeriodResultDTO :: getProjectId)); - - List projects = - projectNodePeriodPerOrgList.stream().map(ProjectOrgPeriodResultDTO::getProjectId).distinct().collect(Collectors.toList()); - - if(!projects.isEmpty()){ - List responseList = baseDao.selectResponseTrace(projects); - Map> sorted = - responseList.stream().collect(Collectors.groupingBy(ProjectOrgRelationWhenResponseResultDTO::getProjectId)); - skipLevelGrouping(projectMap,sorted); - List result = new LinkedList<>(); - projectMap.values().forEach(list -> {list.forEach(obj -> {result.add(obj);});}); - return result; - } - } - - return new ArrayList<>(); - } /** * @Description 直接从项目业务改造获取项目节点耗时信息 @@ -166,75 +129,6 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl transfer ; response response transfer ; return ; response close. - * @param dest - Map> 需要填充的数据 projectMap - * @param fillFactor - Map> 填充因子 - * @return - * @author wangc - * @date 2020.09.18 15:27 - **/ - private void skipLevelGrouping(Map> dest,Map> fillFactor){ - for(String projectId : fillFactor.keySet()){ - //拿到同一个项目下的的节点记录(只有存在响应节点的项目) - List projectTraceUnit = fillFactor.get(projectId); - if(!projectTraceUnit.isEmpty()){ - // K : staffId - // V : 项目下对于某个员工(可能是在不同部门、网格、机关下)的所有节点顺时针操作,因为对于但项目单人来说,只能串行不能并行 - Map> staffResponseTrace = - projectTraceUnit.stream().collect(Collectors.groupingBy(ProjectOrgRelationWhenResponseResultDTO::getStaffId)); - if(!CollectionUtils.isEmpty(staffResponseTrace)){ - List incompleteBody = dest.get(projectId); - if(!CollectionUtils.isEmpty(incompleteBody)) { - Map> incompleteBodyGroupByStaffMap = - incompleteBody.stream().collect(Collectors.groupingBy(ProjectOrgPeriodResultDTO::getStaffId)); - if(!CollectionUtils.isEmpty(incompleteBodyGroupByStaffMap)) { - staffResponseTrace.keySet().forEach(staffId -> { - List staffResponseTraceUnit - = staffResponseTrace.get(staffId); - List incompleteBodyUnit = incompleteBodyGroupByStaffMap.get(staffId); - if (!CollectionUtils.isEmpty(incompleteBodyUnit) && !CollectionUtils.isEmpty(staffResponseTraceUnit)) { - - //int lastEndCount = NumConstant.ONE_NEG; - a: - for (int index = NumConstant.ZERO; index < staffResponseTraceUnit.size(); index++) { - - if (StringUtils.equals("response", staffResponseTraceUnit.get(index).getOperation())) { - replaceFirstResponseDate(incompleteBodyUnit,staffResponseTraceUnit.get(index)); - int cursor = index; - if (cursor == staffResponseTraceUnit.size() - NumConstant.ZERO) break; - while (StringUtils.equals("response", staffResponseTraceUnit.get(cursor++).getOperation())) { - if (cursor == staffResponseTraceUnit.size() - NumConstant.ZERO) break a; - } - if (cursor == staffResponseTraceUnit.size() - NumConstant.ZERO) break; - index = cursor; - } else { - replaceFirstResponseDate(incompleteBodyUnit,staffResponseTraceUnit.get(index)); - } - } - } - }); - } - } - } - - } - } - } - - private void replaceFirstResponseDate(List 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()); - } - - } - - } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectMainDailyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectMainDailyDao.xml index ec08e185d4..4e70db274a 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectMainDailyDao.xml +++ b/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, diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenDifficultyDataDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenDifficultyDataDao.xml index e27bfde00f..ed0681e753 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenDifficultyDataDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenDifficultyDataDao.xml @@ -135,6 +135,7 @@ EVENT_IMG_URL, EVENT_SOURCE, EVENT_CONTENT, + EVENT_TITLE, EVENT_COST_TIME, EVENT_RE_ORG, EVENT_HANDLED_COUNT, @@ -164,6 +165,7 @@ #{item.eventImgUrl}, #{item.eventSource}, #{item.eventContent}, + #{item.eventTitle}, #{item.eventCostTime}, #{item.eventReOrg}, #{item.eventHandledCount}, diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/project/ProjectProcessDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/project/ProjectProcessDao.xml index 52e37bca95..7960594364 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/project/ProjectProcessDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/project/ProjectProcessDao.xml @@ -306,40 +306,4 @@ - - - - - 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 - - ( - (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' - ) - - - \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/ProjectOrgPeriodResultDTO.java b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/ProjectOrgPeriodResultDTO.java new file mode 100644 index 0000000000..1548cdd9ef --- /dev/null +++ b/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; + +} diff --git a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/ProjectOrgRelationWhenResponseResultDTO.java b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/ProjectOrgRelationWhenResponseResultDTO.java new file mode 100644 index 0000000000..e29f37dde9 --- /dev/null +++ b/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; +} diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/ProjectController.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/ProjectController.java index 0d500784db..184a51f644 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/ProjectController.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/ProjectController.java @@ -157,4 +157,9 @@ public class ProjectController { return new Result(); } + @PostMapping("compensation") + public Result compensation(){ + projectService.projectProcessCostTimeDataCompensation(); + return new Result(); + } } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectDao.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectDao.java index 4d20d6327c..0584789909 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectDao.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectDao.java @@ -121,4 +121,13 @@ public interface ProjectDao extends BaseDao { * @Description 根据客户Id、机关Id、议题Id查询项目数据是否存在 **/ List selectProjectList(ProjectDTO projectDTO); + + /** + * @Description 得到所有的customerId + * @param + * @return java.util.List + * @author wangc + * @date 2020.10.26 11:20 + */ + List selectAllCustomerIds(); } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectOrgRelationDao.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectOrgRelationDao.java index 146d58cc04..b628f0cbbe 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectOrgRelationDao.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectOrgRelationDao.java @@ -18,6 +18,7 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.dto.ProjectOrgRelationDTO; import com.epmet.entity.ProjectOrgRelationEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -69,5 +70,22 @@ public interface ProjectOrgRelationDao extends BaseDao * @date 2020.10.22 13:37 */ List selectAllUnhandledProcess(@Param("projectId")String projectId); + + /** + * @Description 批量新增(数据补偿) + * @param list + * @return int + * @author wangc + * @date 2020.10.26 13:55 + */ + int batchInsertProjectOrgRelation(@Param("list") List list); + /** + * @Description 批量删除 + * @param list + * @return int + * @author wangc + * @date 2020.10.26 14:07 + */ + int deleteBatch(@Param("list") List list); } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectProcessDao.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectProcessDao.java index 333d1aefeb..dc3260b2c8 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectProcessDao.java +++ b/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 { * @author zxc */ Integer checkProjectClose(ProjectIdFormDTO projectIdFormDTO); + + /** + * @Description 查询项目-机关各个节点的响应列表 + * @param projects + * @return + * @author wangc + * @date 2020.09.17 17:56 + **/ + List selectResponseTrace(@Param("projects") List projects); } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectStaffDao.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectStaffDao.java index 244ae3e56d..b3728bf23a 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectStaffDao.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectStaffDao.java @@ -108,4 +108,16 @@ public interface ProjectStaffDao extends BaseDao { * @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 selectProjectOrgPeriod(@Param("customerId") String customerId); + + + } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectProcessService.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectProcessService.java index 98bb36ec5d..794960ea13 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectProcessService.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectProcessService.java @@ -19,12 +19,10 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; -import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.dto.ProjectProcessDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.entity.ProjectProcessEntity; -import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.Map; @@ -136,4 +134,13 @@ public interface ProjectProcessService extends BaseService */ ProjectDetailCheckResultDTO checkProjectClose(ProjectIdFormDTO projectIdFormDTO); + /** + * @Description 查询项目-机关各个节点的响应列表 + * @param projects + * @return + * @author wangc + * @date 2020.09.17 17:56 + **/ + List selectResponseTrace(List projects); + } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectService.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectService.java index ab6e688a1a..6e361c77b3 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectService.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectService.java @@ -197,4 +197,14 @@ public interface ProjectService extends BaseService { * @return void */ void sendMessage(String customerId); + + + /** + * @Description 项目节点耗时数据补齐 + * @param + * @return void + * @author wangc + * @date 2020.10.26 10:54 + */ + void projectProcessCostTimeDataCompensation(); } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectStaffService.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectStaffService.java index 386a92e61f..fa4f17266d 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectStaffService.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectStaffService.java @@ -26,6 +26,7 @@ import com.epmet.dto.result.DepartmentStaffListResultDTO; import com.epmet.dto.result.StaffUnHandledDTO; import com.epmet.entity.ProjectStaffEntity; + import java.util.List; import java.util.Map; @@ -169,4 +170,14 @@ public interface ProjectStaffService extends BaseService { * @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 selectProjectOrgPeriod(String customerId); + } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java index 4b965badfa..92f5992a48 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java @@ -399,4 +399,16 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl selectResponseTrace(List projects) { + return baseDao.selectResponseTrace(projects); + } + } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java index 5ae016bb5e..569502ff7d 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java @@ -45,6 +45,7 @@ import com.epmet.redis.ProjectRedis; import com.epmet.service.*; import org.apache.commons.collections4.CollectionUtils; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -54,6 +55,7 @@ import org.springframework.transaction.annotation.Transactional; import java.text.SimpleDateFormat; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -987,6 +989,84 @@ public class ProjectServiceImpl extends BaseServiceImpl customers = baseDao.selectAllCustomerIds(); + if(CollectionUtils.isEmpty(customers))return; + List totalContainer = new LinkedList<>(); + customers.forEach(customerId -> { + List projectNodePeriodPerOrgList = projectStaffService.selectProjectOrgPeriod(customerId); + if(!org.springframework.util.CollectionUtils.isEmpty(projectNodePeriodPerOrgList)){ + + Map> projectMap + = projectNodePeriodPerOrgList.stream().collect(Collectors.groupingBy(ProjectOrgPeriodResultDTO :: getProjectId)); + + List projects = + projectNodePeriodPerOrgList.stream().map(ProjectOrgPeriodResultDTO::getProjectId).distinct().collect(Collectors.toList()); + + if(!projects.isEmpty()){ + List responseList = projectProcessService.selectResponseTrace(projects); + Map> sorted = + responseList.stream().collect(Collectors.groupingBy(ProjectOrgRelationWhenResponseResultDTO::getProjectId)); + skipLevelGrouping(projectMap,sorted); + List calculatedData = new LinkedList<>(); + projectMap.values().forEach(list -> {list.forEach(obj -> {calculatedData.add(obj);});}); + + + if(!org.apache.commons.collections4.CollectionUtils.isEmpty(calculatedData)){ + List 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 identities = totalContainer.stream().map(ProjectOrgRelationDTO::getProjectStaffId).distinct().collect(Collectors.toList()); + ListUtils.partition(identities,NumConstant.ONE_THOUSAND).forEach(partition -> {relationDao.deleteBatch(partition);}); + + List 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 batchDelta_T = batchCalculateDelta_T(ProjectConstant.IMPRECISE_CALCULATION, + ProjectConstant.CALCULATION_TYPE_DEFAULT,timeInterval); + + Map 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> partition = ListUtils.partition(totalContainer, NumConstant.ONE_HUNDRED); + partition.forEach(subList -> {relationDao.batchInsertProjectOrgRelation(subList);}); + } + } + } + private void setMessage(String customerId, List overdueList, List delayList, List list) { list = list.stream().distinct().collect(Collectors.toList()); Map> overdueMap = overdueList.stream().collect(Collectors.groupingBy(StaffUnHandledDTO::getStaffId)); @@ -1061,4 +1141,71 @@ public class ProjectServiceImpl extends BaseServiceImpl transfer ; response response transfer ; return ; response close. + * @param dest - Map> 需要填充的数据 projectMap + * @param fillFactor - Map> 填充因子 + * @return + * @author wangc + * @date 2020.09.18 15:27 + **/ + private void skipLevelGrouping(Map> dest, Map> fillFactor){ + for(String projectId : fillFactor.keySet()){ + //拿到同一个项目下的的节点记录(只有存在响应节点的项目) + List projectTraceUnit = fillFactor.get(projectId); + if(!projectTraceUnit.isEmpty()){ + // K : staffId + // V : 项目下对于某个员工(可能是在不同部门、网格、机关下)的所有节点顺时针操作,因为对于但项目单人来说,只能串行不能并行 + Map> staffResponseTrace = + projectTraceUnit.stream().collect(Collectors.groupingBy(ProjectOrgRelationWhenResponseResultDTO::getStaffId)); + if(!org.springframework.util.CollectionUtils.isEmpty(staffResponseTrace)){ + List incompleteBody = dest.get(projectId); + if(!org.springframework.util.CollectionUtils.isEmpty(incompleteBody)) { + Map> incompleteBodyGroupByStaffMap = + incompleteBody.stream().collect(Collectors.groupingBy(ProjectOrgPeriodResultDTO::getStaffId)); + if(!org.springframework.util.CollectionUtils.isEmpty(incompleteBodyGroupByStaffMap)) { + staffResponseTrace.keySet().forEach(staffId -> { + List staffResponseTraceUnit + = staffResponseTrace.get(staffId); + List 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 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()); + } + + } } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectStaffServiceImpl.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectStaffServiceImpl.java index 7250b38f63..9ef8a2dc14 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectStaffServiceImpl.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectStaffServiceImpl.java @@ -30,6 +30,7 @@ import com.epmet.dao.ProjectStaffDao; import com.epmet.dto.ProjectStaffDTO; import com.epmet.dto.form.DepartmentStaffListFormDTO; import com.epmet.dto.form.TransferOptionalStaffListFormDTO; + import com.epmet.dto.result.DepartmentResultDTO; import com.epmet.dto.result.DepartmentStaffListResultDTO; import com.epmet.dto.result.StaffUnHandledDTO; @@ -194,4 +195,10 @@ public class ProjectStaffServiceImpl extends BaseServiceImpl selectProjectOrgPeriod(String customerId) { + + return baseDao.selectProjectOrgPeriod(customerId); + } + } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/resources/db/migration/V0.0.2__period.sql b/epmet-module/gov-project/gov-project-server/src/main/resources/db/migration/V0.0.2__period.sql new file mode 100644 index 0000000000..f992e621dd --- /dev/null +++ b/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; + + diff --git a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectOrgRelationDao.xml b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectOrgRelationDao.xml index c033280163..6cbb71d1ae 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectOrgRelationDao.xml +++ b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectOrgRelationDao.xml @@ -103,4 +103,49 @@ HANDLED_DATE IS NULL + + + + 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 + + ( + (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' + ) + + + + + + DELETE + project_org_relation + WHERE + + PROJECT_STAFF_ID = #{projectStaffId} + + + \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectProcessDao.xml b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectProcessDao.xml index 788b589863..ceb579138d 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectProcessDao.xml +++ b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectProcessDao.xml @@ -60,4 +60,28 @@ AND project_id = #{projectId} + + \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml index 126315eb4b..ae9ebb16bb 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml +++ b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml @@ -140,4 +140,39 @@ LIMIT 1 + + + + \ No newline at end of file