diff --git a/epmet-admin/epmet-admin-server/deploy/docker-compose-dev.yml b/epmet-admin/epmet-admin-server/deploy/docker-compose-dev.yml index f86422e850..408ecd1fa8 100644 --- a/epmet-admin/epmet-admin-server/deploy/docker-compose-dev.yml +++ b/epmet-admin/epmet-admin-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-admin-server: container_name: epmet-admin-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/epmet-admin-server:0.3.15 + image: 192.168.1.130:10080/epmet-cloud-dev/epmet-admin-server:version_placeholder ports: - "8082:8082" network_mode: host # 使用现有网络 diff --git a/epmet-admin/epmet-admin-server/deploy/docker-compose-test.yml b/epmet-admin/epmet-admin-server/deploy/docker-compose-test.yml index 575e1267c8..29673cca9c 100644 --- a/epmet-admin/epmet-admin-server/deploy/docker-compose-test.yml +++ b/epmet-admin/epmet-admin-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-admin-server: container_name: epmet-admin-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-admin-server:0.3.15 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-admin-server:version_placeholder ports: - "8082:8082" network_mode: host # 使用现有网络 diff --git a/epmet-auth/deploy/docker-compose-dev.yml b/epmet-auth/deploy/docker-compose-dev.yml index 0ee4421f6f..1239aa8ac7 100644 --- a/epmet-auth/deploy/docker-compose-dev.yml +++ b/epmet-auth/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-auth-server: container_name: epmet-auth-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/epmet-auth:0.3.69 + image: 192.168.1.130:10080/epmet-cloud-dev/epmet-auth:version_placeholder ports: - "8081:8081" network_mode: host # 使用现有网络 diff --git a/epmet-auth/deploy/docker-compose-test.yml b/epmet-auth/deploy/docker-compose-test.yml index e4aab166ec..521eea2a30 100644 --- a/epmet-auth/deploy/docker-compose-test.yml +++ b/epmet-auth/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-auth-server: container_name: epmet-auth-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-auth:0.3.68 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-auth:version_placeholder ports: - "8081:8081" network_mode: host # 使用现有网络 diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/BaseRequestLogAspect.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/BaseRequestLogAspect.java index b8a38908a0..8dd819e4b7 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/BaseRequestLogAspect.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/BaseRequestLogAspect.java @@ -66,7 +66,7 @@ public abstract class BaseRequestLogAspect { resultInfoLog(transactionSerial, getExecPeriod(startTime), result); } catch (RenException e) { result = handleRenException(e); - resultErrorLog(transactionSerial, getExecPeriod(startTime), result, e.getMsg(), ExceptionUtils.getErrorStackTrace(e)); + resultErrorLog(transactionSerial, getExecPeriod(startTime), result, e.getInternalMsg(), ExceptionUtils.getErrorStackTrace(e)); } catch (ValidateException e) { result = handleValidateException(e); resultErrorLog(transactionSerial, getExecPeriod(startTime), result, e.getMsg(), ExceptionUtils.getErrorStackTrace(e)); @@ -142,7 +142,7 @@ public abstract class BaseRequestLogAspect { */ private Result handlerRuntimeException(RuntimeException ex) { Result result=new Result().error(); - result.setInternalMsg(ex.getMessage()); + //result.setInternalMsg(ex.getMessage()); return result; } @@ -174,14 +174,20 @@ public abstract class BaseRequestLogAspect { */ private Result handleRenException(RenException e) { if (e.getCode() > 8000) { - // 原样返回 - Result result=new Result().error(e.getCode()); - result.setInternalMsg(e.getMsg()); + Result result; + if (StringUtils.isNotBlank(e.getMsg())) { + // 抛出异常的时候填写了自定义显示信息,把显示信息返回 + result = new Result().error(e.getCode(), e.getMsg()); + } else { + // 没有填写显示信息,则根据code找固定的显示信息 + result = new Result().error(e.getCode()); + } + result.setInternalMsg(e.getInternalMsg()); return result; } // 转化成服务器开小差... Result result=new Result().error(); - result.setInternalMsg(e.getMsg()); + result.setInternalMsg(e.getInternalMsg()); //result.setMsg(e.getMsg()); return result; } diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/AppClientConstant.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/AppClientConstant.java index 65673d8e19..2d12ab77ce 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/AppClientConstant.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/AppClientConstant.java @@ -50,4 +50,8 @@ public interface AppClientConstant { * 事务流水号,每次请求串起来的多个服务拥有相同的流水号,便于日志追踪 */ String TRANSACTION_SERIAL_KEY = "Transaction-Serial"; + /** + * app类型-工作端 + */ + String APP_WORK = "work"; } diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java index 01af04ae04..59e3ce4bdc 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java @@ -26,10 +26,11 @@ public interface NumConstant { int TEN = 10; int ELEVEN = 11; int TWELVE = 12; - + int SEVENTEEN = 17; int FIFTEEN = 15; int FOURTEEN=14; int TWENTY = 20; + int TWENTY_FOUR = 24; int THIRTY = 30; int THIRTY_ONE = 31; int FORTY = 40; diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/RenException.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/RenException.java index 36d9a85418..8d6285a26c 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/RenException.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/RenException.java @@ -21,26 +21,67 @@ import org.apache.commons.lang3.StringUtils; public class RenException extends RuntimeException { private static final long serialVersionUID = 1L; private int code; + /** + * 显示给客户的消息 + */ private String msg; + /** + * 内部消息,用于服务之间传递错误信息,排错用 + */ + private String internalMsg; public RenException(int code) { this(code, ""); } + public RenException(int code, String internalMsg) { + super(internalMsg); + this.code = code; + if (StringUtils.isBlank(internalMsg)) { + this.internalMsg = EpmetErrorCode.getMsg(code); + if (StringUtils.isBlank(this.internalMsg)) { + this.internalMsg = MessageUtils.getMessage(code, internalMsg); + } + } else { + this.internalMsg = internalMsg; + } + } + + public RenException(int code, String internalMsg, String msg) { + this(code, internalMsg); + this.msg = msg; + } + + public RenException(String internalMsg) { + super(internalMsg); +// this.code = ErrorCode.INTERNAL_SERVER_ERROR; + this.code = EpmetErrorCode.SERVER_ERROR.getCode(); + this.internalMsg = internalMsg; + } + + public RenException(String internalMsg, String msg) { + this(internalMsg); + this.msg = msg; + } + + + + + public RenException(int code, String... params) { this.code = code; - this.msg = EpmetErrorCode.getMsg(code); - if (StringUtils.isBlank(this.msg)) { - this.msg = MessageUtils.getMessage(code, params); + this.internalMsg = EpmetErrorCode.getMsg(code); + if (StringUtils.isBlank(this.internalMsg)) { + this.internalMsg = MessageUtils.getMessage(code, params); } } public RenException(int code, Throwable e) { super(e); this.code = code; - this.msg = EpmetErrorCode.getMsg(code); - if (StringUtils.isBlank(this.msg)) { - this.msg = MessageUtils.getMessage(code); + this.internalMsg = EpmetErrorCode.getMsg(code); + if (StringUtils.isBlank(this.internalMsg)) { + this.internalMsg = MessageUtils.getMessage(code); } } @@ -50,40 +91,18 @@ public class RenException extends RuntimeException { } - public RenException(int code, String msg) { - super(msg); - this.code = code; - if (StringUtils.isBlank(msg)) { - this.msg = EpmetErrorCode.getMsg(code); - if (StringUtils.isBlank(this.msg)) { - this.msg = MessageUtils.getMessage(code, msg); - } - } else { - this.msg = msg; - } - } - - - public RenException(String msg) { - super(msg); -// this.code = ErrorCode.INTERNAL_SERVER_ERROR; + public RenException(String internalMsg, Throwable e) { + super(internalMsg, e); this.code = EpmetErrorCode.SERVER_ERROR.getCode(); - this.msg = msg; + this.internalMsg = internalMsg; } - public RenException(String msg, Throwable e) { - super(msg, e); -// this.code = ErrorCode.INTERNAL_SERVER_ERROR; - this.code = EpmetErrorCode.SERVER_ERROR.getCode(); - this.msg = msg; + public String getInternalMsg() { + return internalMsg; } - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; + public void setInternalMsg(String internalMsg) { + this.internalMsg = internalMsg; } public int getCode() { @@ -94,4 +113,11 @@ public class RenException extends RuntimeException { this.code = code; } + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } } diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/RenExceptionHandler.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/RenExceptionHandler.java index 5debad3823..035ec89088 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/RenExceptionHandler.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/RenExceptionHandler.java @@ -24,7 +24,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DuplicateKeyException; import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; import java.util.Date; @@ -56,12 +55,12 @@ public class RenExceptionHandler { public Result handleRRException(RenException ex){ if (ex.getCode() > 8000) { Result result=new Result().error(ex.getCode()); - result.setData(ex.getMsg()); + result.setData(ex.getInternalMsg()); return result; } logger.error(ExceptionUtils.getErrorStackTrace(ex)); Result result=new Result().error(); - result.setData(ex.getMsg()); + result.setData(ex.getInternalMsg()); return result; // return new Result().error(); } diff --git a/epmet-gateway/deploy/docker-compose-dev.yml b/epmet-gateway/deploy/docker-compose-dev.yml index ad7aa38516..45db293a98 100644 --- a/epmet-gateway/deploy/docker-compose-dev.yml +++ b/epmet-gateway/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-gateway-server: container_name: epmet-gateway-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/epmet-gateway:0.3.35 + image: 192.168.1.130:10080/epmet-cloud-dev/epmet-gateway:version_placeholder ports: - "8080:8080" network_mode: host # 使用现有网络 diff --git a/epmet-gateway/deploy/docker-compose-test.yml b/epmet-gateway/deploy/docker-compose-test.yml index b0b7024f33..5a88a1e499 100644 --- a/epmet-gateway/deploy/docker-compose-test.yml +++ b/epmet-gateway/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-gateway-server: container_name: epmet-gateway-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-gateway:0.3.30 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-gateway:version_placeholder ports: - "8080:8080" network_mode: host # 使用现有网络 diff --git a/epmet-gateway/pom.xml b/epmet-gateway/pom.xml index b8157a9836..f67d250648 100644 --- a/epmet-gateway/pom.xml +++ b/epmet-gateway/pom.xml @@ -288,10 +288,11 @@ lb://gov-issue-server - + lb://gov-project-server lb://common-service-server + lb://resi-home-server diff --git a/epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java b/epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java index 18854a8776..8af2cdd5ef 100644 --- a/epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java +++ b/epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java @@ -3,7 +3,6 @@ package com.epmet.auth; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; -import com.epmet.commons.tools.utils.Result; import com.epmet.filter.CpProperty; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -15,7 +14,6 @@ import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.util.AntPathMatcher; import org.springframework.web.server.ServerWebExchange; -import reactor.core.publisher.Mono; /** * 外部应用认证 @@ -93,7 +91,7 @@ public class ExternalAuthProcessor extends AuthProcessor { } } catch (RenException e) { //return response(exchange, new Result<>().error(e.getCode(), e.getMsg())); - throw new RenException(e.getCode(),e.getMsg()); + throw new RenException(e.getCode(),e.getInternalMsg()); } catch (Exception e) { logger.error("外部应用请求认证发生未知错误:" + ExceptionUtils.getErrorStackTrace(e)); //return response(exchange, new Result<>().error("外部应用请求认证发生未知错误")); diff --git a/epmet-gateway/src/main/java/com/epmet/auth/InternalAuthProcessor.java b/epmet-gateway/src/main/java/com/epmet/auth/InternalAuthProcessor.java index 43895ce9af..98583c8f3c 100644 --- a/epmet-gateway/src/main/java/com/epmet/auth/InternalAuthProcessor.java +++ b/epmet-gateway/src/main/java/com/epmet/auth/InternalAuthProcessor.java @@ -54,7 +54,7 @@ public class InternalAuthProcessor extends AuthProcessor { baseTokenDto = getBaseTokenDto(token, jwtTokenUtils); }catch(RenException e){ //return response(exchange,new Result<>().error(e.getCode(),e.getMsg())); - throw new RenException(e.getCode(), e.getMsg()); + throw new RenException(e.getCode(), e.getInternalMsg()); } }else{ baseTokenDto = null; @@ -97,7 +97,7 @@ public class InternalAuthProcessor extends AuthProcessor { validateTokenDto(baseTokenDto, token); } catch (RenException e) { //return response(exchange, new Result<>().error(e.getCode(), e.getMsg())); - throw new RenException(e.getCode(), e.getMsg()); + throw new RenException(e.getCode(), e.getInternalMsg()); } } diff --git a/epmet-gateway/src/main/resources/bootstrap.yml b/epmet-gateway/src/main/resources/bootstrap.yml index d78c96140e..ad698b4d8a 100644 --- a/epmet-gateway/src/main/resources/bootstrap.yml +++ b/epmet-gateway/src/main/resources/bootstrap.yml @@ -445,6 +445,7 @@ epmet: - /data/stats/** - /epmet/ext/** - /epmetuser/customerstaff/customerlist + - /message/template/** swaggerUrls: diff --git a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/form/AnScreenRankFormDTO.java b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/form/AnScreenRankFormDTO.java index 2b787582dd..f7afcbe24f 100644 --- a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/form/AnScreenRankFormDTO.java +++ b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/form/AnScreenRankFormDTO.java @@ -25,4 +25,8 @@ public class AnScreenRankFormDTO implements Serializable { private String agencyId; @NotNull(message = "top值不能为空", groups = AnScreenRankFormDTO.AnScreenRankGroup.class) private Integer topNum; + /** + * 月份ID,默认上一个月 + */ + private String monthId; } diff --git a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/MonthScoreListResultDTO.java b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/MonthScoreListResultDTO.java index 0acdbf9c73..19fad59717 100644 --- a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/MonthScoreListResultDTO.java +++ b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/MonthScoreListResultDTO.java @@ -30,6 +30,14 @@ public class MonthScoreListResultDTO implements Serializable { * 能力总分 */ private Double indexTotal; + /** + * 能力总分在上级的权重 + */ + private Double indexTotalSupWeight; + /** + * 能力总分原始值 + */ + private Double indexTotalOriginScore; /** * 本级能力分 */ diff --git a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/PmRankResultDTO.java b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/PmRankResultDTO.java index c813fdf694..7a2717a86b 100644 --- a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/PmRankResultDTO.java +++ b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/PmRankResultDTO.java @@ -47,4 +47,8 @@ public class PmRankResultDTO implements Serializable { * 议题数 */ private Integer issueTotal; + /** + * 月份Id + */ + private String monthId; } diff --git a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/ScoreListResultDTO.java b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/ScoreListResultDTO.java index 3b299ac780..64d2b02a95 100644 --- a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/ScoreListResultDTO.java +++ b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/ScoreListResultDTO.java @@ -21,6 +21,14 @@ public class ScoreListResultDTO implements Serializable { * 总分(保留一位小数) */ private Double indexTotal; + /** + * 能力总分在上级的权重 + */ + private Double indexTotalSupWeight; + /** + * 能力总分原始值 + */ + private Double indexTotalOriginScore; /** * 本级分数(保留一位小数) */ diff --git a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/form/DifficultyRankFormDTO.java b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/form/DifficultyRankFormDTO.java new file mode 100644 index 0000000000..5a3936db6a --- /dev/null +++ b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/form/DifficultyRankFormDTO.java @@ -0,0 +1,43 @@ +package com.epmet.project.dto.form; + +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 数据改版-难点堵点项目排行--接口入参 + * @Author jiangyy + */ +@Data +public class DifficultyRankFormDTO implements Serializable { + private static final long serialVersionUID = -2880432640584616651L; + public interface DifficultyRankInternalGroup {} + /** + * 组织Id + */ + @NotBlank(message = "组织ID不能为空",groups = {DifficultyRankInternalGroup.class}) + private String agencyId; + /** + * 状态: 待处理: pending; 结案closed + */ + private String status; + /** + * 排序类型 耗时最长:timelongest;涉及部门最多:mostdepts;处理次数:mosthandled + */ + @NotBlank(message = "排序类型不能为空", groups = {DifficultyRankInternalGroup.class}) + private String type; + /** + * 获取数据个数 默认前10 + */ + private Integer topNum = 10; + + @Min(value = 1, groups = {DifficultyRankInternalGroup.class}) + private Integer pageNo; + + /** + * 组织类型: 网格:grid ; 组织:agency + */ + private String orgType; +} \ No newline at end of file diff --git a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/result/ProjectDifficultRankResultDTO.java b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/result/ProjectDifficultRankResultDTO.java new file mode 100644 index 0000000000..f781d62d15 --- /dev/null +++ b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/result/ProjectDifficultRankResultDTO.java @@ -0,0 +1,59 @@ +package com.epmet.project.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * @Description 难点赌点-耗时最长|涉及部门最多|处理次数 返参DTO + * @NEI https://nei.netease.com/interface/detail/res/?pid=57068&id=321614 + * @ClassName DifficultProjectResultDTO + * @Auth jiangyy + * @Date 2020-08-20 13:43 + */ +@Data +public class ProjectDifficultRankResultDTO implements Serializable { + private static final long serialVersionUID = -7338625142484943434L; + /** + * 项目id + * */ + private String projectId; + + /** + * 项目标题 + * */ + private String title; + + /** + * 状态: 待处理: pending; 结案closed + * */ + private String statusCode; + + /** + * 社区-网格名 + * */ + private String gridName; + + /** + * 图片列表 + * */ + private List imgUrlList; + + /** + * 耗时,单位分钟 + * */ + private Integer totalHours; + + /** + * 涉及多少个部门 + * */ + private Integer reOrg; + + /** + * 处理次数 + * */ + private Integer handledCount; + +} diff --git a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/result/ProjectNextAgencyResultDTO.java b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/result/ProjectNextAgencyResultDTO.java new file mode 100644 index 0000000000..2c867a6398 --- /dev/null +++ b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/result/ProjectNextAgencyResultDTO.java @@ -0,0 +1,34 @@ +package com.epmet.project.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description 难点赌点-当前登录人员本级一级下一级组织机构/网格 返参DTO + * @NEI https://nei.netease.com/interface/detail/res/?pid=57068&id=321614 + * @ClassName DifficultProjectResultDTO + * @Auth jiangyy + * @Date 2020-08-20 13:43 + */ +@Data +public class ProjectNextAgencyResultDTO implements Serializable { + private static final long serialVersionUID = -7338625142484943434L; + /** + * 组织id + * */ + private String orgId; + + /** + * 组织名称 + * */ + private String orgName; + + /** + * 网格:grid ; 组织:agency + * */ + private String orgType; + + +} diff --git a/epmet-module/data-report/data-report-server/deploy/docker-compose-dev.yml b/epmet-module/data-report/data-report-server/deploy/docker-compose-dev.yml index 8be97cd85a..a98722271e 100644 --- a/epmet-module/data-report/data-report-server/deploy/docker-compose-dev.yml +++ b/epmet-module/data-report/data-report-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: data-report-server: container_name: data-report-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/data-report-server:0.3.36 + image: 192.168.1.130:10080/epmet-cloud-dev/data-report-server:version_placeholder ports: - "8109:8109" network_mode: host # 使用现有网络 diff --git a/epmet-module/data-report/data-report-server/deploy/docker-compose-prod.yml b/epmet-module/data-report/data-report-server/deploy/docker-compose-prod.yml index d382dfd284..276d37e95b 100644 --- a/epmet-module/data-report/data-report-server/deploy/docker-compose-prod.yml +++ b/epmet-module/data-report/data-report-server/deploy/docker-compose-prod.yml @@ -2,7 +2,7 @@ version: "3.7" services: data-report-server: container_name: data-report-server-prod - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-master/data-report-server:0.3.44 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-master/data-report-server:0.3.45 ports: - "8108:8108" network_mode: host # 使用现有网络 diff --git a/epmet-module/data-report/data-report-server/deploy/docker-compose-test.yml b/epmet-module/data-report/data-report-server/deploy/docker-compose-test.yml index 8917a4f9e9..2b55a26867 100644 --- a/epmet-module/data-report/data-report-server/deploy/docker-compose-test.yml +++ b/epmet-module/data-report/data-report-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: data-report-server: container_name: data-report-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/data-report-server:0.3.36 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/data-report-server:version_placeholder ports: - "8108:8108" network_mode: host # 使用现有网络 diff --git a/epmet-module/data-report/data-report-server/pom.xml b/epmet-module/data-report/data-report-server/pom.xml index 4992a47231..5ce4fb7db8 100644 --- a/epmet-module/data-report/data-report-server/pom.xml +++ b/epmet-module/data-report/data-report-server/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - 0.3.44 + 0.3.45 data-report-server @@ -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 9966047056..94186e7336 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,13 +1,14 @@ -package com.epmet.module.project.controller; +package com.epmet.datareport.controller.project; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.datareport.service.project.ProjectService; import com.epmet.dto.form.ProcessListFormDTO; -import com.epmet.module.project.service.ProjectService; import com.epmet.project.constant.ProjectConstant; +import com.epmet.project.dto.form.DifficultyRankFormDTO; import com.epmet.project.dto.form.ProjectIncrTrendFormDTO; import com.epmet.project.dto.result.*; import org.springframework.beans.factory.annotation.Autowired; @@ -91,4 +92,33 @@ public class ProjectController { return new Result().ok(projectService.projectDetail(processListFormDTO)); } + /** + * @param param + * @return + * @Description 难点赌点-耗时最长|涉及部门最多|处理次数 返回该组织下所有的难点堵点的 数据 + * @NEI https://nei.netease.com/interface/detail/res/?pid=57068&id=321614 + * @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/evaluationindex/screenan/ScreenAnGrassRootsPmRankDao.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screenan/ScreenAnGrassRootsPmRankDao.java index 141853010d..821ccb6c1f 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screenan/ScreenAnGrassRootsPmRankDao.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screenan/ScreenAnGrassRootsPmRankDao.java @@ -35,11 +35,12 @@ public interface ScreenAnGrassRootsPmRankDao { * 基层党员-党员排行榜单 * * @param agencyId + * @param monthId * @param topNum * @return java.util.List * @author zhaoqifeng * @date 2020/10/9 15:43 */ - List selectPmRank(@Param("agencyId") String agencyId, @Param("topNum") Integer topNum); + List selectPmRank(@Param("agencyId") String agencyId, @Param("monthId") String monthId, @Param("topNum") Integer topNum); } \ No newline at end of file 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/evaluationindex/screen/impl/AnScreenServiceImpl.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/AnScreenServiceImpl.java index 0d8a064bcb..158ca87d8e 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/AnScreenServiceImpl.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/AnScreenServiceImpl.java @@ -10,6 +10,7 @@ import com.epmet.evaluationindex.screen.dto.form.AnScreenFormDTO; import com.epmet.evaluationindex.screen.dto.form.AnScreenRankFormDTO; import com.epmet.evaluationindex.screen.dto.form.AnScreenTrendFormDTO; import com.epmet.evaluationindex.screen.dto.result.*; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -47,6 +48,7 @@ public class AnScreenServiceImpl implements AnScreenService { * @date 2020/10/9 13:55 */ @Override + @DataSource(value = DataSourceConstant.EVALUATION_INDEX,datasourceNameFromArg = true) public PmTotalResultDTO pmTotal(AnScreenFormDTO formDTO) { return screenAnGrassRootsPmTotalMonthlyDao.selectPmTotal(formDTO.getAgencyId(), formDTO.getMonthId()); } @@ -60,6 +62,7 @@ public class AnScreenServiceImpl implements AnScreenService { * @date 2020/10/9 13:57 */ @Override + @DataSource(value = DataSourceConstant.EVALUATION_INDEX,datasourceNameFromArg = true) public PmTotalTrendResultDTO pmTotalTrend(AnScreenTrendFormDTO formDTO) { PmTotalTrendResultDTO resultDTO = new PmTotalTrendResultDTO(); String yearId = DateUtils.format(new Date(), DateUtils.DATE_PATTERN_YYYY); @@ -86,8 +89,13 @@ public class AnScreenServiceImpl implements AnScreenService { * @date 2020/10/9 13:59 */ @Override + @DataSource(value = DataSourceConstant.EVALUATION_INDEX,datasourceNameFromArg = true) public List pmRank(AnScreenRankFormDTO formDTO) { - return screenAnGrassRootsPmRankDao.selectPmRank(formDTO.getAgencyId(), formDTO.getTopNum()); + String monthId = formDTO.getMonthId(); + if (StringUtils.isBlank(monthId)){ + monthId = DateUtils.getBeforeNMonth(1); + } + return screenAnGrassRootsPmRankDao.selectPmRank(formDTO.getAgencyId(), monthId,formDTO.getTopNum()); } /** @@ -99,6 +107,7 @@ public class AnScreenServiceImpl implements AnScreenService { * @date 2020/10/9 14:01 */ @Override + @DataSource(value = DataSourceConstant.EVALUATION_INDEX,datasourceNameFromArg = true) public GrassRootsOrgResultDTO grassRootsOrg(AnScreenFormDTO formDTO) { return screenAnGrassRootsOrgMonthlyDao.selectGrassRootsOrg(formDTO.getAgencyId(), formDTO.getMonthId()); } @@ -112,6 +121,7 @@ public class AnScreenServiceImpl implements AnScreenService { * @date 2020/10/9 14:03 */ @Override + @DataSource(value = DataSourceConstant.EVALUATION_INDEX,datasourceNameFromArg = true) public GrassRootsOrgTrendResultDTO grassRootsOrgTrend(AnScreenTrendFormDTO formDTO) { GrassRootsOrgTrendResultDTO resultDTO = new GrassRootsOrgTrendResultDTO(); String yearId = DateUtils.format(new Date(), DateUtils.DATE_PATTERN_YYYY); @@ -136,6 +146,7 @@ public class AnScreenServiceImpl implements AnScreenService { * @date 2020/10/9 14:06 */ @Override + @DataSource(value = DataSourceConstant.EVALUATION_INDEX,datasourceNameFromArg = true) public List grassRootsOrgRank(AnScreenFormDTO formDTO) { return screenAnGrassRootsOrgMonthlyDao.selectGrassRootsOrgRank(formDTO.getAgencyId(), formDTO.getMonthId()); } @@ -149,6 +160,7 @@ public class AnScreenServiceImpl implements AnScreenService { * @date 2020/10/9 14:10 */ @Override + @DataSource(value = DataSourceConstant.EVALUATION_INDEX,datasourceNameFromArg = true) public GrassRootsGovernResultDTO grassRootsGovern(AnScreenFormDTO formDTO) { return screenAnGrassRootsGovernMonthlyDao.selectGrassRootsGovern(formDTO.getAgencyId(), formDTO.getMonthId()); } @@ -162,6 +174,7 @@ public class AnScreenServiceImpl implements AnScreenService { * @date 2020/10/9 14:11 */ @Override + @DataSource(value = DataSourceConstant.EVALUATION_INDEX,datasourceNameFromArg = true) public GrassRootsGovernTrendResultDTO grassRootsGovernTrend(AnScreenTrendFormDTO formDTO) { GrassRootsGovernTrendResultDTO resultDTO = new GrassRootsGovernTrendResultDTO(); String yearId = DateUtils.format(new Date(), DateUtils.DATE_PATTERN_YYYY); @@ -190,6 +203,7 @@ public class AnScreenServiceImpl implements AnScreenService { * @date 2020/10/9 14:13 */ @Override + @DataSource(value = DataSourceConstant.EVALUATION_INDEX,datasourceNameFromArg = true) public List grassRootsGovernRank(AnScreenFormDTO formDTO) { return screenAnGrassRootsGovernMonthlyDao.selectGrassRootsGovernRank(formDTO.getAgencyId(), formDTO.getMonthId()); } @@ -203,6 +217,7 @@ public class AnScreenServiceImpl implements AnScreenService { * @date 2020/10/9 14:16 */ @Override + @DataSource(value = DataSourceConstant.EVALUATION_INDEX,datasourceNameFromArg = true) public List projectProfile(String customerId) { return screenAnCommunityProjectProfileDao.selectProjectProfile(customerId); } 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 f4c4afa4d0..18246addc6 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.dto.form.ProcessListFormDTO; import com.epmet.project.dto.form.ProjectIncrTrendFormDTO; import com.epmet.project.dto.result.*; @@ -50,4 +51,23 @@ public interface ProjectService { * @date 2020/10/23 10:33 上午 */ ProjectDetailResultDTO projectDetail( ProcessListFormDTO processListFormDTO); + + /** + * @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 45f1f87a0b..9c2336d992 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,25 +1,32 @@ package com.epmet.datareport.service.project.impl; +import com.epmet.commons.dynamic.datasource.annotation.DataSource; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.DateUtils; import com.epmet.commons.tools.utils.Result; +import com.epmet.constant.DataSourceConstant; import com.epmet.datareport.dao.project.ProjectDao; import com.epmet.datareport.service.evaluationindex.screen.ScreenDifficultyDataService; +import com.epmet.datareport.service.project.ProjectService; +import com.epmet.dto.CustomerAgencyDTO; import com.epmet.dto.form.LoginUserDetailsFormDTO; import com.epmet.dto.form.ProcessListFormDTO; -import com.epmet.dto.result.LoginUserDetailsResultDTO; -import com.epmet.dto.result.ProcessAndCurrentDeptResultDTO; +import com.epmet.dto.form.SubAgencyFormDTO; +import com.epmet.dto.result.*; import com.epmet.evaluationindex.screen.dto.result.DepartmentNameListResultDTO; import com.epmet.feign.EpmetUserOpenFeignClient; +import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.feign.GovProjectOpenFeignClient; -import com.epmet.module.project.service.ProjectService; import com.epmet.project.constant.ProjectConstant; import com.epmet.project.dto.FactAgencyProjectDailyDTO; +import com.epmet.project.dto.form.DifficultyRankFormDTO; import com.epmet.project.dto.form.ProjectIncrTrendFormDTO; +import com.epmet.project.dto.result.ProjectDetailResultDTO; import com.epmet.project.dto.result.*; +import com.github.pagehelper.PageHelper; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -47,6 +54,9 @@ public class ProjectServiceImpl implements ProjectService { @Autowired private ScreenDifficultyDataService screenDifficultyDataService; + @Autowired + private GovOrgOpenFeignClient govOrgOpenFeignClient; + /** * @Author sun * @Description 数据-项目-获取汇总数据 @@ -219,4 +229,99 @@ 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 ("community".equals(customerAgencyDTO.getData().getLevel())) { + //取下级网格 + Result> gridListResult = govOrgOpenFeignClient.listGridsbystaffid(userId); + List gridList = gridListResult.getData(); + for (int i = 0; i < gridList.size(); i++) { + ProjectNextAgencyResultDTO subAgencyDto = new ProjectNextAgencyResultDTO(); + subAgencyDto.setOrgId(gridList.get(i).getGridId()); + subAgencyDto.setOrgName(gridList.get(i).getGridName()); + subAgencyDto.setOrgType("grid"); + resultList.add(subAgencyDto); + } + } else { + //取下级组织机构 + SubAgencyFormDTO form = new SubAgencyFormDTO(); + form.setAgencyId(agencyId); + form.setAgencyNum(100); + Result 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) { + PageHelper.startPage(null == param.getPageNo() ? NumConstant.ONE:param.getPageNo(),param.getTopNum()); + 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/logback-spring.xml b/epmet-module/data-report/data-report-server/src/main/resources/logback-spring.xml index 1be215aa54..648ed8d9db 100644 --- a/epmet-module/data-report/data-report-server/src/main/resources/logback-spring.xml +++ b/epmet-module/data-report/data-report-server/src/main/resources/logback-spring.xml @@ -142,14 +142,7 @@ - - - - - - - - + @@ -162,13 +155,7 @@ - - - - - - - + diff --git a/epmet-module/data-report/data-report-server/src/main/resources/mapper/fact/FactIndexAgencyScoreDao.xml b/epmet-module/data-report/data-report-server/src/main/resources/mapper/fact/FactIndexAgencyScoreDao.xml index 9bc3f57b22..6eb14469a2 100644 --- a/epmet-module/data-report/data-report-server/src/main/resources/mapper/fact/FactIndexAgencyScoreDao.xml +++ b/epmet-module/data-report/data-report-server/src/main/resources/mapper/fact/FactIndexAgencyScoreDao.xml @@ -25,6 +25,8 @@ SELECT fact.index_code AS "indexCode", ROUND(fact.score*fact.WEIGHT, 1) AS "indexTotal", + ROUND(fact.score,1) AS "indexTotalOriginScore", + fact.WEIGHT AS "indexTotalSupWeight", ROUND(self.self_score*fact.WEIGHT, 1) AS "agencyScore", self.self_score AS selfOriginScore, self.SELF_WEIGHT AS agencyWeight, @@ -49,6 +51,8 @@ SELECT fact.month_id AS "monthId", ROUND(fact.score*fact.WEIGHT, 1) AS "indexTotal", + ROUND(fact.score,1) AS "indexTotalOriginScore", + fact.WEIGHT AS "indexTotalSupWeight", ROUND(self.self_score*fact.WEIGHT, 1) AS "agencyScore", ROUND(self.sub_score*fact.WEIGHT, 1) AS "subAgencyScore", fact.index_code AS "indexCode" diff --git a/epmet-module/data-report/data-report-server/src/main/resources/mapper/fact/FactIndexCommunityScoreDao.xml b/epmet-module/data-report/data-report-server/src/main/resources/mapper/fact/FactIndexCommunityScoreDao.xml index 64e645e536..ca682e107b 100644 --- a/epmet-module/data-report/data-report-server/src/main/resources/mapper/fact/FactIndexCommunityScoreDao.xml +++ b/epmet-module/data-report/data-report-server/src/main/resources/mapper/fact/FactIndexCommunityScoreDao.xml @@ -25,6 +25,8 @@ SELECT fact.index_code AS "indexCode", ROUND(fact.score*fact.WEIGHT, 1) AS "indexTotal", + ROUND(fact.score,1) AS "indexTotalOriginScore", + fact.WEIGHT AS "indexTotalSupWeight", ROUND(self.self_score*fact.WEIGHT, 1) AS "agencyScore", self.self_score AS selfOriginScore, self.SELF_WEIGHT AS agencyWeight, @@ -49,6 +51,8 @@ SELECT fact.month_id AS "monthId", ROUND(fact.score*fact.WEIGHT, 1) AS "indexTotal", + ROUND(fact.score,1) AS "indexTotalOriginScore", + fact.WEIGHT AS "indexTotalSupWeight", ROUND(self.self_score*fact.WEIGHT, 1) AS "agencyScore", ROUND(self.sub_score*fact.WEIGHT, 1) AS "subAgencyScore", fact.index_code AS "indexCode" diff --git a/epmet-module/data-report/data-report-server/src/main/resources/mapper/fact/FactIndexGridScoreDao.xml b/epmet-module/data-report/data-report-server/src/main/resources/mapper/fact/FactIndexGridScoreDao.xml index 5ee3c7d5f8..708a5fbf1f 100644 --- a/epmet-module/data-report/data-report-server/src/main/resources/mapper/fact/FactIndexGridScoreDao.xml +++ b/epmet-module/data-report/data-report-server/src/main/resources/mapper/fact/FactIndexGridScoreDao.xml @@ -25,6 +25,8 @@ SELECT fact.index_code AS "indexCode", ROUND(fact.score*fact.WEIGHT, 1) AS "indexTotal", + ROUND(fact.score,1) AS "indexTotalOriginScore", + fact.WEIGHT AS "indexTotalSupWeight", ROUND(self.self_score*fact.WEIGHT, 1) AS "agencyScore", self.self_score AS selfOriginScore, self.SELF_WEIGHT AS agencyWeight, @@ -50,6 +52,8 @@ SELECT fact.month_id AS "monthId", ROUND(fact.score*fact.WEIGHT, 1) AS "indexTotal", + ROUND(fact.score,1) AS "indexTotalOriginScore", + fact.WEIGHT AS "indexTotalSupWeight", ROUND(self.self_score*fact.WEIGHT, 1) AS "agencyScore", ROUND(self.sub_score*fact.WEIGHT, 1) AS "subAgencyScore", fact.index_code AS "indexCode" 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..2b9fba6e2d 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,45 @@ )a ORDER BY a.month_id DESC,a.type ASC + + + + + \ No newline at end of file diff --git a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenDifficultyDataDao.xml b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenDifficultyDataDao.xml index 9c1325f591..a342420f2d 100644 --- a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenDifficultyDataDao.xml +++ b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenDifficultyDataDao.xml @@ -10,7 +10,6 @@ diff.EVENT_CONTENT AS title, diff.EVENT_STATUS_CODE AS STATUS, ROUND(diff.EVENT_COST_TIME/60,0) AS totalHours, - DATE_FORMAT( eve.EVENT_CREATE_TIME, '%Y-%m-%d %H:%i' ) AS createDateTime, diff.EVENT_SOURCE AS gridName, diff.EVENT_IMG_URL AS imgUrl, diff.EVENT_CATEGORY_NAME AS categoryName, @@ -18,8 +17,6 @@ diff.EVENT_RE_ORG AS handleCount FROM screen_difficulty_data diff - LEFT JOIN screen_event_data eve ON diff.EVENT_ID = eve.EVENT_ID - AND eve.DEL_FLAG = '0' WHERE diff.DEL_FLAG = '0' AND diff.ALL_PARENT_IDS LIKE CONCAT('%',#{agencyId},'%') diff --git a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screenan/ScreenAnGrassRootsPmRankDao.xml b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screenan/ScreenAnGrassRootsPmRankDao.xml index dc13015231..feb6f4d1b4 100644 --- a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screenan/ScreenAnGrassRootsPmRankDao.xml +++ b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screenan/ScreenAnGrassRootsPmRankDao.xml @@ -4,16 +4,19 @@ diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.xml index d0b868f62f..a01747d444 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.xml @@ -119,69 +119,7 @@ - - - - - + + \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/project/ProjectProcessDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/project/ProjectProcessDao.xml index a1a4a7f483..efa7b82bb4 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 @@ -98,6 +98,7 @@ + + + + + + + + + \ No newline at end of file diff --git a/epmet-module/epmet-activiti/epmet-activiti-server/deploy/docker-compose-dev.yml b/epmet-module/epmet-activiti/epmet-activiti-server/deploy/docker-compose-dev.yml index d2925901c9..e79e2ccfc3 100644 --- a/epmet-module/epmet-activiti/epmet-activiti-server/deploy/docker-compose-dev.yml +++ b/epmet-module/epmet-activiti/epmet-activiti-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-activiti-server: container_name: epmet-activiti-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/epmet-activiti-server:0.3.0 + image: 192.168.1.130:10080/epmet-cloud-dev/epmet-activiti-server:version_placeholder ports: - "8086:8086" network_mode: host # 使用现有网络 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 new file mode 100644 index 0000000000..487a596d09 --- /dev/null +++ b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/form/CostDayFormDTO.java @@ -0,0 +1,35 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author zhaoqifeng + * @dscription + * @date 2020/10/21 17:34 + */ +@Data +public class CostDayFormDTO implements Serializable { + private static final long serialVersionUID = -1002961480112906533L; + /** + * 项目ID + */ + private String id; + + /** + * 工作人员ID + */ + private String staffId; + + /** + * 起始日期 + */ + private Date startDate; + + /** + * 终止日期 + */ + private Date endDate; +} 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/dto/result/CostDayResultDTO.java b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/result/CostDayResultDTO.java new file mode 100644 index 0000000000..7087768d4b --- /dev/null +++ b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/dto/result/CostDayResultDTO.java @@ -0,0 +1,37 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author zhaoqifeng + * @dscription + * @date 2020/10/21 17:53 + */ +@Data +public class CostDayResultDTO implements Serializable { + private static final long serialVersionUID = -1575208332115510050L; + /** + * 项目ID + */ + private String id; + + /** + * 工作人员ID + */ + private String staffId; + + /** + * 已滞留工作日 + */ + private Integer detentionDays; + + /** + * 起始日期 + */ + private Date startDate; + + +} 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 c2471c0255..a29e1f5203 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 @@ -2,9 +2,12 @@ package com.epmet.feign; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.form.CostDayFormDTO; import com.epmet.dto.form.ExternalAppAuthFormDTO; import com.epmet.dto.form.GetJwtAccessTokenFormDTO; import com.epmet.dto.form.WorkDayFormDTO; +import com.epmet.dto.result.CostDayResultDTO; +import com.epmet.dto.form.WorkMinuteFormDTO; import com.epmet.dto.result.AppIdInfoResultDTO; import com.epmet.dto.result.ExternalAppAuthResultDTO; import com.epmet.dto.result.WorkDayResultDTO; @@ -14,6 +17,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; +import java.util.Map; /** * 本服务对外开放的API,其他服务通过引用此client调用该服务 @@ -22,7 +26,7 @@ import java.util.List; * @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 = "localhost:8103") +//@FeignClient(name = ServiceConstant.EPMET_COMMON_SERVICE, fallback = EpmetCommonServiceOpenFeignClientFallback.class, url = "http://localhost:8103") public interface EpmetCommonServiceOpenFeignClient { /** * @param formDTO @@ -67,4 +71,34 @@ public interface EpmetCommonServiceOpenFeignClient { @PostMapping("/commonservice/externalapp/appidinfo") Result appIdInfo(@RequestBody String appId); + + /** + * 工作日计算 + * @author zhaoqifeng + * @date 2020/10/22 9:25 + * @param formDTO + * @return com.epmet.commons.tools.utils.Result> + */ + @PostMapping("commonservice/workday/workdays") + Result> costWorkDays(@RequestBody List formDTO); + + /** + * 日历天计算 + * @author zhaoqifeng + * @date 2020/10/22 9:25 + * @param formDTO + * @return com.epmet.commons.tools.utils.Result> + */ + @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 198bd13203..bd397df1d0 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 @@ -3,9 +3,12 @@ package com.epmet.feign.fallback; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.utils.ModuleUtils; import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.form.CostDayFormDTO; import com.epmet.dto.form.ExternalAppAuthFormDTO; import com.epmet.dto.form.GetJwtAccessTokenFormDTO; import com.epmet.dto.form.WorkDayFormDTO; +import com.epmet.dto.form.WorkMinuteFormDTO; +import com.epmet.dto.result.CostDayResultDTO; import com.epmet.dto.result.AppIdInfoResultDTO; import com.epmet.dto.result.ExternalAppAuthResultDTO; import com.epmet.dto.result.WorkDayResultDTO; @@ -13,6 +16,7 @@ import com.epmet.feign.EpmetCommonServiceOpenFeignClient; import org.springframework.stereotype.Component; import java.util.List; +import java.util.Map; /** * 本服务对外开放的API,其他服务通过引用此client调用该服务 @@ -51,4 +55,35 @@ public class EpmetCommonServiceOpenFeignClientFallback implements EpmetCommonSer public Result getAccessToken(GetJwtAccessTokenFormDTO form) { return ModuleUtils.feignConError(ServiceConstant.EPMET_COMMON_SERVICE, "getAccessToken", form); } + + /** + * 工作日计算 + * + * @param formDTO + * @return com.epmet.commons.tools.utils.Result> + * @author zhaoqifeng + * @date 2020/10/22 9:25 + */ + @Override + public Result> costWorkDays(List formDTO) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_COMMON_SERVICE, "costWorkDays", formDTO); + } + + /** + * 日历天计算 + * + * @param formDTO + * @return com.epmet.commons.tools.utils.Result> + * @author zhaoqifeng + * @date 2020/10/22 9:25 + */ + @Override + 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/deploy/docker-compose-dev.yml b/epmet-module/epmet-common-service/common-service-server/deploy/docker-compose-dev.yml index e575112640..691e0700f5 100644 --- a/epmet-module/epmet-common-service/common-service-server/deploy/docker-compose-dev.yml +++ b/epmet-module/epmet-common-service/common-service-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: common-service-server: container_name: common-service-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/common-service-server:0.3.16 + image: 192.168.1.130:10080/epmet-cloud-dev/common-service-server:version_placeholder ports: - "8103:8103" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-common-service/common-service-server/deploy/docker-compose-test.yml b/epmet-module/epmet-common-service/common-service-server/deploy/docker-compose-test.yml index c3ed2186f6..058b976195 100644 --- a/epmet-module/epmet-common-service/common-service-server/deploy/docker-compose-test.yml +++ b/epmet-module/epmet-common-service/common-service-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: common-service-server: container_name: common-service-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/common-service-server:0.3.7 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/common-service-server:version_placeholder ports: - "8103:8103" network_mode: host # 使用现有网络 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 0d975a0c31..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 @@ -1,7 +1,10 @@ package com.epmet.controller; import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.form.CostDayFormDTO; import com.epmet.dto.form.WorkDayFormDTO; +import com.epmet.dto.result.CostDayResultDTO; +import com.epmet.dto.form.WorkMinuteFormDTO; import com.epmet.dto.result.WorkDayResultDTO; import com.epmet.service.WorkDayService; import org.springframework.beans.factory.annotation.Autowired; @@ -11,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Map; /** * @Description 工作日计算 @@ -36,5 +40,45 @@ public class WorkDayController { List list = workDayService.detentionDays(formDTO); return new Result>().ok(list); } + + + /** + * 工作日计算 + * @author zhaoqifeng + * @date 2020/10/22 9:23 + * @param formDTO + * @return com.epmet.commons.tools.utils.Result> + */ + @PostMapping("workdays") + public Result> costWorkDays(@RequestBody List formDTO) { + List list = workDayService.costWorkDays(formDTO); + return new Result>().ok(list); + } + + /** + * 日历天计算 + * @author zhaoqifeng + * @date 2020/10/22 9:23 + * @param formDTO + * @return com.epmet.commons.tools.utils.Result> + */ + @PostMapping("calendardays") + public Result> costCalendarDays(@RequestBody List formDTO) { + List list = workDayService.costCalendarDays(formDTO); + 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 7433b154c1..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 @@ -1,9 +1,14 @@ package com.epmet.service; +import com.epmet.dto.form.CostDayFormDTO; import com.epmet.dto.form.WorkDayFormDTO; +import com.epmet.dto.result.CostDayResultDTO; +import com.epmet.dto.form.WorkMinuteFormDTO; import com.epmet.dto.result.WorkDayResultDTO; + import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -13,4 +18,31 @@ import java.util.Set; */ public interface WorkDayService { List detentionDays(List formDTO); + + /** + * 工作日计算 + * @author zhaoqifeng + * @date 2020/10/21 17:56 + * @param formDTO + * @return java.util.List + */ + List costWorkDays(List formDTO); + + /** + * 日历日计算 + * @author zhaoqifeng + * @date 2020/10/21 17:56 + * @param formDTO + * @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 25ede12e88..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,17 +1,30 @@ package com.epmet.service.impl; +import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.utils.DateUtils; +import com.epmet.commons.tools.utils.DateUtils; +import com.epmet.constant.ProjectConstant; import com.epmet.dao.CalenderDao; +import com.epmet.dto.form.CostDayFormDTO; +import com.epmet.dto.form.TimestampIntervalFormDTO; import com.epmet.dto.form.WorkDayFormDTO; +import com.epmet.dto.result.CostDayResultDTO; +import com.epmet.dto.form.WorkMinuteFormDTO; import com.epmet.dto.result.WorkDayResultDTO; import com.epmet.entity.CalenderEntity; import com.epmet.service.WorkDayService; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; import java.util.*; /** @@ -25,6 +38,8 @@ public class WorkDayServiceImpl implements WorkDayService { @Autowired private CalenderDao calenderDao; + private static SimpleDateFormat format = new SimpleDateFormat(DateUtils.DATE_PATTERN); + private static SimpleDateFormat formatMinute = new SimpleDateFormat(DateUtils.DATE_TIME_PATTERN); @Override public List detentionDays(List workDayFormDTO) { List list = new ArrayList<>(); @@ -44,6 +59,95 @@ public class WorkDayServiceImpl implements WorkDayService { return list; } + /** + * 工作日计算 + * + * @param formDTO + * @return java.util.List + * @author zhaoqifeng + * @date 2020/10/21 17:56 + */ + @Override + public List costWorkDays(List formDTO) { + List list = new ArrayList<>(); + if (formDTO.isEmpty()) { + throw new RenException("起始时间、终止时间不能为空"); + } + for (CostDayFormDTO form : formDTO) { + CostDayResultDTO result = new CostDayResultDTO(); + result.setId(form.getId()); + result.setStaffId(form.getStaffId()); + result.setDetentionDays(this.getWorkDays(form.getStartDate(), form.getEndDate())); + result.setStartDate(form.getStartDate()); + list.add(result); + } + return list; + } + + /** + * 日历日计算 + * + * @param formDTO + * @return java.util.List + * @author zhaoqifeng + * @date 2020/10/21 17:56 + */ + @Override + public List costCalendarDays(List formDTO) { + List list = new ArrayList<>(); + if (formDTO.isEmpty()) { + throw new RenException("起始时间、终止时间不能为空"); + } + for (CostDayFormDTO form : formDTO) { + CostDayResultDTO result = new CostDayResultDTO(); + result.setId(form.getId()); + result.setStaffId(form.getStaffId()); + result.setDetentionDays(this.getCalendarDays(form.getStartDate(), form.getEndDate())); + result.setStartDate(form.getStartDate()); + list.add(result); + } + return list; + } + + /** + * @Description 计算经历的多少分钟(只计算工作日) + * @param param + * @return java.util.Map + * @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)) { @@ -77,6 +181,249 @@ public class WorkDayServiceImpl implements WorkDayService { return "-1"; } + /*** + * @Description 计算两个日期之间的非准确时间差(只包括工作日),单位:分钟 不足一天按照一天计算 + * @param left + * @param right + * @return java.lang.Integer + * @author wangc + * @date 2020.10.21 17:09 + */ + private Integer calculateImpreciseDetentionMinutes(Date left, Date right){ + if(null == left){ logger.error("计算工作日,传入的开始日期为空!");return null;} + //给右区间赋值,默认当前时间 + if(null == right || right.compareTo(left) < NumConstant.ZERO) right = new Date(); + + List 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); + String endDateStr = DateUtils.format(end, DateUtils.DATE_PATTERN_YYYYMMDD); + if (startDateStr.equals(endDateStr)) { + logger.info(String.format("%s-%s起止时间一致,返回<1,",startDateStr,endDateStr)); + return 0; + } + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); + try { + Date startDate = simpleDateFormat.parse(startDateStr); + Date endDate = simpleDateFormat.parse(endDateStr); + long day = (endDate.getTime() - startDate.getTime()) / (24 * 60 * 60 * 1000); + logger.info(String.format("当前日期[%s]-被吹日期[%s]=%s", endDateStr, startDateStr, day)); + List list = calenderDao.selectByStartAndEnd(startDateStr, endDateStr); + + long totalHoliday = 0; + for (CalenderEntity calenderEntity : list) { + if (!"1".equals(calenderEntity.getType())) { + totalHoliday += 1; + } + } + logger.info(String.format("期间的节假日[%s-%s]=%s", endDateStr, startDateStr, totalHoliday)); + long detentionDay = day - totalHoliday; + logger.info(String.format("当前日期[%s]-被吹日期[%s]-期间的节假日[%s]=%s", endDateStr, startDateStr, totalHoliday, detentionDay)); + return (int)detentionDay; + } catch (Exception e) { + e.printStackTrace(); + } + return -1; + } + + + private Integer getCalendarDays(Date start, Date end) { + String startDateStr = DateUtils.format(start, DateUtils.DATE_PATTERN_YYYYMMDD); + String endDateStr = DateUtils.format(end, DateUtils.DATE_PATTERN_YYYYMMDD); + if (startDateStr.equals(endDateStr)) { + logger.info(String.format("%s-%s起止时间一致,返回<1,",startDateStr,endDateStr)); + return 0; + } + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); + try { + Date startDate = simpleDateFormat.parse(startDateStr); + Date endDate = simpleDateFormat.parse(endDateStr); + long day = (endDate.getTime() - startDate.getTime()) / (24 * 60 * 60 * 1000); + return (int)day; + } catch (Exception e) { + e.printStackTrace(); + } + return -1; + } + } 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/epmet-ext/epmet-ext-server/deploy/docker-compose-dev.yml b/epmet-module/epmet-ext/epmet-ext-server/deploy/docker-compose-dev.yml index 7792a04b31..2b3437321d 100644 --- a/epmet-module/epmet-ext/epmet-ext-server/deploy/docker-compose-dev.yml +++ b/epmet-module/epmet-ext/epmet-ext-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-ext-server: container_name: epmet-ext-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/epmet-ext-server:0.0.6 + image: 192.168.1.130:10080/epmet-cloud-dev/epmet-ext-server:version_placeholder ports: - "8113:8113" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-ext/epmet-ext-server/deploy/docker-compose-test.yml b/epmet-module/epmet-ext/epmet-ext-server/deploy/docker-compose-test.yml index 90c7053d1f..922073b042 100644 --- a/epmet-module/epmet-ext/epmet-ext-server/deploy/docker-compose-test.yml +++ b/epmet-module/epmet-ext/epmet-ext-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-ext-server: container_name: epmet-ext-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-ext-server:0.0.1 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-ext-server:version_placeholder ports: - "8113:8113" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/constant/ModuleConstant.java b/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/constant/ModuleConstant.java index d8b34dc284..1bc1cc935a 100644 --- a/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/constant/ModuleConstant.java +++ b/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/constant/ModuleConstant.java @@ -14,4 +14,6 @@ public interface ModuleConstant { String ERROR_EPMET_USER = "调用epmet_user服务查询网格下的所有工作人员失败"; + String ERROR_AGENCY = "调用gov_org服务查询组织基本信息失败"; + } diff --git a/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/controller/OpenUpController.java b/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/controller/OpenUpController.java index 81ccddbdff..162b493bd3 100644 --- a/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/controller/OpenUpController.java +++ b/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/controller/OpenUpController.java @@ -11,8 +11,10 @@ import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.service.OpenUpService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.util.List; @@ -100,5 +102,28 @@ public class OpenUpController { return govOrgOpenFeignClient.staffPermissionExt(commonStaffIdFormDTO.getStaffId()); } + /** + * @Description 对外接口-根据组织Id获取组织信息 + * @author sun + **/ + @PostMapping("agencyinfo") + Result agencyInfo(@RequestBody AgencyInfoFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO, AgencyInfoFormDTO.StaffIdGroup.class); + if (!"agency".equals(formDTO.getOrgType()) && !"grid".equals(formDTO.getOrgType())) { + return new Result().error("参数错误,orgType值类型错误!"); + } + return new Result().ok(openUpService.agencyInfo(formDTO)); + } + + /** + * @Description 外挂-获取当前组织及部门、网格数据,递归查询所有下级数据 + * @author sun + **/ + @PostMapping("organizetree") + Result organizeTree(@RequestBody OrganizeTreeFormDTO formDTO){ + ValidatorUtils.validateEntity(formDTO, OrganizeTreeFormDTO.StaffIdGroup.class); + return new Result().ok(openUpService.organizeTree(formDTO)); + } + } diff --git a/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/service/OpenUpService.java b/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/service/OpenUpService.java index 5ecbf7aedb..ceecebc6c5 100644 --- a/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/service/OpenUpService.java +++ b/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/service/OpenUpService.java @@ -1,11 +1,7 @@ package com.epmet.service; -import com.epmet.dto.form.StaffSinAgencyFormDTO; -import com.epmet.dto.form.StaffSinDeptFormDTO; -import com.epmet.dto.form.StaffSinGridFormDTO; -import com.epmet.dto.result.StaffSinAgencyResultDTO; -import com.epmet.dto.result.StaffSinDeptResultDTO; -import com.epmet.dto.result.StaffSinGridResultDTO; +import com.epmet.dto.form.*; +import com.epmet.dto.result.*; import java.util.List; @@ -38,4 +34,16 @@ public interface OpenUpService { * @date 2020/8/17 9:59 上午 */ List staffSinAgency(StaffSinAgencyFormDTO formDTO); + + /** + * @Description 对外接口-根据组织Id获取组织信息 + * @author sun + **/ + AgencyInfoResultDTO agencyInfo(AgencyInfoFormDTO formDTO); + + /** + * @Description 外挂-获取当前组织及部门、网格数据,递归查询所有下级数据 + * @author sun + **/ + OrganizeTreeResultDTO organizeTree(OrganizeTreeFormDTO formDTO); } diff --git a/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/service/impl/OpenUpServiceImpl.java b/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/service/impl/OpenUpServiceImpl.java index 38120535b9..170c3e32c4 100644 --- a/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/service/impl/OpenUpServiceImpl.java +++ b/epmet-module/epmet-ext/epmet-ext-server/src/main/java/com/epmet/service/impl/OpenUpServiceImpl.java @@ -6,9 +6,7 @@ import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.utils.Result; import com.epmet.constant.ModuleConstant; import com.epmet.dto.form.*; -import com.epmet.dto.result.StaffSinAgencyResultDTO; -import com.epmet.dto.result.StaffSinDeptResultDTO; -import com.epmet.dto.result.StaffSinGridResultDTO; +import com.epmet.dto.result.*; import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.service.OpenUpService; @@ -123,4 +121,30 @@ public class OpenUpServiceImpl implements OpenUpService { return staffInfoList.getData(); } + /** + * @Description 对外接口-根据组织Id获取组织信息 + * @author sun + **/ + @Override + public AgencyInfoResultDTO agencyInfo(AgencyInfoFormDTO formDTO) { + Result result = govOrgOpenFeignClient.agencyInfo(formDTO); + if (!result.success()){ + throw new RenException(result.getInternalMsg()); + } + return result.getData(); + } + + /** + * @Description 外挂-获取当前组织及部门、网格数据,递归查询所有下级数据 + * @author sun + **/ + @Override + public OrganizeTreeResultDTO organizeTree(OrganizeTreeFormDTO formDTO) { + Result result = govOrgOpenFeignClient.organizeTree(formDTO.getAgencyId()); + if (!result.success()){ + throw new RenException(result.getInternalMsg()); + } + return result.getData(); + } + } diff --git a/epmet-module/epmet-heart/epmet-heart-server/deploy/docker-compose-dev.yml b/epmet-module/epmet-heart/epmet-heart-server/deploy/docker-compose-dev.yml index 53e5098667..c9324e7eaa 100644 --- a/epmet-module/epmet-heart/epmet-heart-server/deploy/docker-compose-dev.yml +++ b/epmet-module/epmet-heart/epmet-heart-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-heart-server: container_name: epmet-heart-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/epmet-heart-server:0.0.52 + image: 192.168.1.130:10080/epmet-cloud-dev/epmet-heart-server:version_placeholder ports: - "8111:8111" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-heart/epmet-heart-server/deploy/docker-compose-test.yml b/epmet-module/epmet-heart/epmet-heart-server/deploy/docker-compose-test.yml index e259e170a4..98e9560135 100644 --- a/epmet-module/epmet-heart/epmet-heart-server/deploy/docker-compose-test.yml +++ b/epmet-module/epmet-heart/epmet-heart-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-heart-server: container_name: epmet-heart-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-heart-server:0.0.52 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-heart-server:version_placeholder ports: - "8111:8111" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/constant/ActMessageConstant.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/constant/ActMessageConstant.java index 9806de9b80..3d7a57cce9 100644 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/constant/ActMessageConstant.java +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/constant/ActMessageConstant.java @@ -8,6 +8,7 @@ package com.epmet.constant; */ public interface ActMessageConstant { String TITLE="您有一条活动消息"; + String WXMP_TITLE="活动消息"; /** * 报名审核成功,给居民端用户发送消息 */ @@ -29,5 +30,5 @@ public interface ActMessageConstant { /** * 工作端-重新发布活动,通知待审核+已经审核通过的用户 */ - String RE_PUBLISH_ACT="您好,您参与的%s活动,%s,请注意查看"; + String RE_PUBLISH_ACT="您参与的%s活动,%s,请注意查看"; } diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActServiceImpl.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActServiceImpl.java index f8cd7eb1d2..95b1afaa41 100644 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActServiceImpl.java +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActServiceImpl.java @@ -24,6 +24,7 @@ import com.epmet.constant.ReadFlagConstant; import com.epmet.dao.*; import com.epmet.dto.*; import com.epmet.dto.form.UserMessageFormDTO; +import com.epmet.dto.form.WxSubscribeMessageFormDTO; import com.epmet.dto.form.work.*; import com.epmet.dto.result.ActSponsorResultDTO; import com.epmet.dto.result.work.*; @@ -31,6 +32,7 @@ import com.epmet.entity.*; import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.service.*; +import com.epmet.utils.ModuleConstant; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -680,6 +682,7 @@ public class WorkActServiceImpl implements WorkActService { List userIdList=actUserRelationDao.selectUserIdList(formDTO.getActId(),ActConstant.ACT_USER_STATUS_PASSED); if(null!=userIdList&&userIdList.size()>0){ List userMessageFormDTOS=new ArrayList<>(); + List msgList = new ArrayList<>(); for(String userId:userIdList){ UserMessageFormDTO userMessageFormDTO = new UserMessageFormDTO(); userMessageFormDTO.setCustomerId(actInfoDTO.getCustomerId()); @@ -692,11 +695,26 @@ public class WorkActServiceImpl implements WorkActService { actInfoDTO.getTitle(), formDTO.getCancelReason())); userMessageFormDTOS.add(userMessageFormDTO); + //2020.10.26 添加发送微信订阅消息功能 sun + WxSubscribeMessageFormDTO dto = new WxSubscribeMessageFormDTO(); + dto.setCustomerId(actInfoDTO.getCustomerId()); + dto.setClientType(AppClientConstant.APP_RESI); + dto.setUserId(userId); + dto.setBehaviorType(ActMessageConstant.WXMP_TITLE); + dto.setMessageContent(String.format(ActMessageConstant.ACT_CANCELED, actInfoDTO.getTitle(), formDTO.getCancelReason())); + dto.setMessageTime(new Date()); + dto.setGridId("*"); + msgList.add(dto); } Result sendMessageRes= epmetMessageOpenFeignClient.saveUserMessageList(userMessageFormDTOS); if(sendMessageRes.success()){ logger.info("给审核通过的用户发送消息成功"); } + logger.info("取消活动,开始推送微信订阅消息"); + Result wxmpMsg = epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); + if (wxmpMsg.success()) { + logger.info("给审核通过的用户推送微信订阅消息成功"); + } } } diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActUserServiceImpl.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActUserServiceImpl.java index 879213f11a..735c82dda1 100644 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActUserServiceImpl.java +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActUserServiceImpl.java @@ -19,6 +19,7 @@ import com.epmet.dto.ActUserLogDTO; import com.epmet.dto.ActUserRelationDTO; import com.epmet.dto.HeartUserInfoDTO; import com.epmet.dto.form.UserMessageFormDTO; +import com.epmet.dto.form.WxSubscribeMessageFormDTO; import com.epmet.dto.form.work.AactUserDetailFormDTO; import com.epmet.dto.form.work.ActIdFormDTO; import com.epmet.dto.form.work.AuditUserFormDTO; @@ -464,6 +465,8 @@ public class WorkActUserServiceImpl implements WorkActUserService { actUserLogDao.insert(actUserLogEntity); //给居民发消息 this.saveUserMessage(actUserRelationEntity,ActConstant.ACT_USER_STATUS_PASSED,actInfo); + //给居民发送微信订阅消息 sun + this.saveWxmpMessage(actUserRelationEntity,ActConstant.ACT_USER_STATUS_PASSED,actInfo); } /** @@ -511,6 +514,8 @@ public class WorkActUserServiceImpl implements WorkActUserService { actUserLogDao.insert(actUserLogEntity); //给居民发消息 this.saveUserMessage(actUserRelationEntity,ActConstant.ACT_USER_STATUS_REFUSED,actInfo); + //给居民发送微信订阅消息 sun + this.saveWxmpMessage(actUserRelationEntity,ActConstant.ACT_USER_STATUS_REFUSED,actInfo); } /** @@ -645,6 +650,39 @@ public class WorkActUserServiceImpl implements WorkActUserService { } } + /** + * @param actUserRelationEntity type actInfo + * @author sun + * @description 报名审核--给报名申请人发送微信订阅消息 + **/ + private void saveWxmpMessage(ActUserRelationEntity actUserRelationEntity, String type, ActInfoEntity actInfo) { + List list = new ArrayList<>(); + try { + WxSubscribeMessageFormDTO msg = new WxSubscribeMessageFormDTO(); + msg.setCustomerId(actInfo.getCustomerId()); + msg.setClientType(AppClientConstant.APP_RESI); + msg.setUserId(actUserRelationEntity.getUserId()); + msg.setBehaviorType(ActMessageConstant.WXMP_TITLE); + msg.setMessageTime(new Date()); + msg.setGridId("*"); + if (ActConstant.ACT_USER_STATUS_PASSED.equals(type)) { + msg.setMessageContent(String.format(ActMessageConstant.AUDIT_PASSED, actInfo.getTitle())); + } else if (ActConstant.ACT_USER_STATUS_REFUSED.equals(type)) { + msg.setMessageContent(String.format(ActMessageConstant.AUDIT_REFUSED, actInfo.getTitle(), actUserRelationEntity.getFailureReason())); + } + list.add(msg); + logger.info("活动报名审核,开始推送微信订阅消息"); + Result result = epmetMessageOpenFeignClient.sendWxSubscribeMessage(list); + if (result.success()) { + logger.info("审核成功,已成功发送微信订阅消息"); + } else { + logger.error("审核成功,发送微信订阅消息失败" + JSON.toJSONString(result)); + } + } catch (Exception e) { + logger.error("审核结果,发送微信订阅消息异常", e.getMessage()); + } + } + /** * @return com.epmet.dto.result.work.HistoricalActInfo * @param userId diff --git a/epmet-module/epmet-job/epmet-job-server/deploy/docker-compose-dev.yml b/epmet-module/epmet-job/epmet-job-server/deploy/docker-compose-dev.yml index c9999c47d8..de0601f085 100644 --- a/epmet-module/epmet-job/epmet-job-server/deploy/docker-compose-dev.yml +++ b/epmet-module/epmet-job/epmet-job-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-job-server: container_name: epmet-job-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/epmet-job-server:0.3.25 + image: 192.168.1.130:10080/epmet-cloud-dev/epmet-job-server:version_placeholder ports: - "8084:8084" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-job/epmet-job-server/deploy/docker-compose-test.yml b/epmet-module/epmet-job/epmet-job-server/deploy/docker-compose-test.yml index a245199249..b0ef2bf2f9 100644 --- a/epmet-module/epmet-job/epmet-job-server/deploy/docker-compose-test.yml +++ b/epmet-module/epmet-job/epmet-job-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-job-server: container_name: epmet-job-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-job-server:0.3.23 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-job-server:version_placeholder ports: - "8084:8084" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/ProjectSendMessageService.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/ProjectSendMessageService.java new file mode 100644 index 0000000000..e005ed2543 --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/ProjectSendMessageService.java @@ -0,0 +1,21 @@ +package com.epmet.service; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.ProjectDTO; +import com.epmet.dto.extract.form.ExtractOriginFormDTO; + +/** + * @author zhaoqifeng + * @dscription + * @date 2020/10/26 15:19 + */ +public interface ProjectSendMessageService { + /** + * 滞留提醒 + * @author zhaoqifeng + * @date 2020/10/26 15:21 + * @param formDTO + * @return com.epmet.commons.tools.utils.Result + */ + Result projectSendMessage(ExtractOriginFormDTO formDTO); +} diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/impl/ProjectSendMessageServiceImpl.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/impl/ProjectSendMessageServiceImpl.java new file mode 100644 index 0000000000..78418a8173 --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/impl/ProjectSendMessageServiceImpl.java @@ -0,0 +1,35 @@ +package com.epmet.service.impl; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.ProjectDTO; +import com.epmet.dto.extract.form.ExtractOriginFormDTO; +import com.epmet.feign.GovProjectOpenFeignClient; +import com.epmet.service.ProjectSendMessageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author zhaoqifeng + * @dscription + * @date 2020/10/26 15:22 + */ +@Service +public class ProjectSendMessageServiceImpl implements ProjectSendMessageService { + @Autowired + private GovProjectOpenFeignClient govProjectOpenFeignClient; + + /** + * 滞留提醒 + * + * @param formDTO + * @return com.epmet.commons.tools.utils.Result + * @author zhaoqifeng + * @date 2020/10/26 15:21 + */ + @Override + public Result projectSendMessage(ExtractOriginFormDTO formDTO) { + ProjectDTO projectDTO = new ProjectDTO(); + projectDTO.setCustomerId(formDTO.getCustomerId()); + return govProjectOpenFeignClient.sendMessageJob(projectDTO); + } +} diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/ProjectSendMessageTask.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/ProjectSendMessageTask.java new file mode 100644 index 0000000000..d116882ee3 --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/ProjectSendMessageTask.java @@ -0,0 +1,43 @@ +package com.epmet.task; + +import com.alibaba.fastjson.JSON; +import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.extract.form.ExtractOriginFormDTO; +import com.epmet.service.ProjectSendMessageService; +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.Component; + +/** + * @author zhaoqifeng + * @dscription + * @date 2020/10/26 15:26 + */ +@Component("projectSendMessageTask") +public class ProjectSendMessageTask implements ITask { + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private ProjectSendMessageService projectSendMessageService; + /** + * 执行定时任务接口 + * + * @param params 参数,多参数使用JSON数据 + */ + @Override + public void run(String params) { + logger.info("ProjectSendMessageTask定时任务正在执行,参数为:{}", params); + ExtractOriginFormDTO formDTO = new ExtractOriginFormDTO(); + if (StringUtils.isNotBlank(params)) { + formDTO = JSON.parseObject(params, ExtractOriginFormDTO.class); + } + Result result = projectSendMessageService.projectSendMessage(formDTO); + if (result.success()) { + logger.info("ProjectSendMessageTask定时任务执行成功"); + } else { + logger.error("ProjectSendMessageTask定时任务执行失败:" + result.getMsg()); + } + } +} diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/WxMsgTemplateSubscribeStatus.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/WxMsgTemplateSubscribeStatus.java new file mode 100644 index 0000000000..9ea7e585ae --- /dev/null +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/WxMsgTemplateSubscribeStatus.java @@ -0,0 +1,7 @@ +package com.epmet.constant; + +public interface WxMsgTemplateSubscribeStatus { + //wx订阅状态 订阅状态(订阅:subscribe 取消订阅:unsubscribe) + String SUBSCRIBE = "subscribe"; + String UNSUBSCRIBE = "unsubscribe"; +} diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/UserMessageDTO.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/UserMessageDTO.java index f8b887c240..d44c80ae47 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/UserMessageDTO.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/UserMessageDTO.java @@ -59,6 +59,11 @@ public class UserMessageDTO implements Serializable { */ private String app; + /** + * 调用者 + */ + private String referer; + /** * 消息标题 */ @@ -104,4 +109,4 @@ public class UserMessageDTO implements Serializable { */ private Date updatedTime; -} \ No newline at end of file +} diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/WxmpMsgSendRecordDTO.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/WxmpMsgSendRecordDTO.java index 99149fde28..ff1b7a4cf0 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/WxmpMsgSendRecordDTO.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/WxmpMsgSendRecordDTO.java @@ -42,6 +42,10 @@ public class WxmpMsgSendRecordDTO implements Serializable { * 客户Id 客户Id */ private String customerId; + /** + * 网格Id(居民端跟网格有关的则有值,工作端以及一些居民端和网格没关的存*) + */ + private String gridId; /** * 所属端类型 居民端:resi 工作端:work @@ -93,6 +97,11 @@ public class WxmpMsgSendRecordDTO implements Serializable { */ private String reason; + /** + * 调用方 + */ + private String referer; + /** * 删除标识 */ diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/WxmpTemplateMsgSubscribeStatusDTO.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/WxmpTemplateMsgSubscribeStatusDTO.java index 00dc07a199..59ad254400 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/WxmpTemplateMsgSubscribeStatusDTO.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/WxmpTemplateMsgSubscribeStatusDTO.java @@ -103,4 +103,6 @@ public class WxmpTemplateMsgSubscribeStatusDTO implements Serializable { */ private Date updatedTime; + private Date templateId; + } \ No newline at end of file diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/ActivationSubscribeFormDTO.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/ActivationSubscribeFormDTO.java new file mode 100644 index 0000000000..3531f5b36d --- /dev/null +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/ActivationSubscribeFormDTO.java @@ -0,0 +1,32 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description 居民端、工作端-重新激活授权页-接口入参 + * @author sun + */ +@Data +public class ActivationSubscribeFormDTO { + + @NotBlank(message = "客户id不能为空", groups = { UpdateWxSubscribeInfoGroup.class }) + private String customerId; + @NotBlank(message = "客户端类型不能为空", groups = { UpdateWxSubscribeInfoGroup.class }) + private String clientType; + @NotBlank(message = "模板ID不能为空", groups = { UpdateWxSubscribeInfoGroup.class }) + private String templateId; + @NotBlank(message = "'是否总是允许'选项不能为空", groups = { UpdateWxSubscribeInfoGroup.class }) + private String alwaysVisit; + /** + * token中用户Id + */ + private String userId; + /** + * 用户对应的openId(居民端一对一,工作端一对多) + */ + private String openId; + public interface UpdateWxSubscribeInfoGroup {} + +} diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/UserMessageFormDTO.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/UserMessageFormDTO.java index f8934cc167..f3298183d6 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/UserMessageFormDTO.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/UserMessageFormDTO.java @@ -56,4 +56,9 @@ public class UserMessageFormDTO implements Serializable { */ @NotBlank(message = "readFlag不能为空") private String readFlag; + + /** + * 调用者 + */ + private String referer; } diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/WxMsgAuthInfoFormDTO.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/WxMsgAuthInfoFormDTO.java index 11d70e506d..c8dde831d2 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/WxMsgAuthInfoFormDTO.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/WxMsgAuthInfoFormDTO.java @@ -8,17 +8,35 @@ import javax.validation.constraints.NotBlank; public class WxMsgAuthInfoFormDTO { public interface SaveSysAuthInfoGroup {} + public interface GetAuthInfoGroup {} + public interface SaveWxSubscribeInfoGroup {} - @NotBlank(message = "客户id不能为空", groups = { SaveSysAuthInfoGroup.class }) + @NotBlank(message = "客户id不能为空", groups = { SaveSysAuthInfoGroup.class, GetAuthInfoGroup.class, SaveWxSubscribeInfoGroup.class }) private String customerId; - @NotBlank(message = "客户端类型不能为空", groups = { SaveSysAuthInfoGroup.class }) + @NotBlank(message = "客户端类型不能为空", groups = { SaveSysAuthInfoGroup.class, GetAuthInfoGroup.class, SaveWxSubscribeInfoGroup.class }) private String clientType; - @NotBlank(message = "是否总是字段不能为空", groups = { SaveSysAuthInfoGroup.class }) + @NotBlank(message = "'是否总是允许'选项不能为空", groups = { SaveSysAuthInfoGroup.class }) private String alwaysVisit; @NotBlank(message = "是否去订阅字段不能为空", groups = { SaveSysAuthInfoGroup.class }) private String subscribeStatus; + @NotBlank(message = "模板ID不能为空", groups = { SaveWxSubscribeInfoGroup.class, GetAuthInfoGroup.class, SaveSysAuthInfoGroup.class }) + private String templateId; + + @NotBlank(message = "微信'是否总是允许'选项不能为空", groups = { SaveWxSubscribeInfoGroup.class }) + private String wxAlwaysVisit; + + @NotBlank(message = "微信'是否订阅字段不能为空'", groups = { SaveWxSubscribeInfoGroup.class }) + private String wxSubscribeStatus; + + @NotBlank(message = "动作类型不能为空", groups = { SaveWxSubscribeInfoGroup.class }) + private String behaviorType; + + + + + } diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/WxSubscribeMessageFormDTO.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/WxSubscribeMessageFormDTO.java index 1dc30e2f8c..2e9e783587 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/WxSubscribeMessageFormDTO.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/WxSubscribeMessageFormDTO.java @@ -48,4 +48,20 @@ public class WxSubscribeMessageFormDTO implements Serializable { @NotBlank(message = "消息内容不能为空") private String messageContent; + /** + * 消息时间 + */ + @NotNull(message = "消息时间不能为空") + private Date messageTime; + + /** + * 网格id-居民端用 + */ + private String gridId; + + /** + * 调用方 + */ + private String referer; + } diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/WxmpMessagePushFormDTO.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/WxmpMessagePushFormDTO.java new file mode 100644 index 0000000000..067ea3b3bb --- /dev/null +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/WxmpMessagePushFormDTO.java @@ -0,0 +1,72 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + * @description: 微信订阅消息FormDTO + * @author: liushaowen + * @date: 2020/10/21 14:29 + */ +@Data +public class WxmpMessagePushFormDTO implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 客户id + */ + @NotBlank(message = "客户id不能为空") + private String customerId; + /** + * 客户端类型 居民端:resi 工作端:work + */ + @NotBlank(message = "客户端类型不能为空") + private String app; + + /** + * 接收者(用户)的 userId + */ + @NotBlank(message = "接收用户id不能为空") + private String userId; + + /** + * 行为类型(存title字段的中间值) 入组申请、党员认证等 + */ + @NotBlank(message = "行为类型不能为空") + private String title; + + /** + * 消息内容 + */ + @NotBlank(message = "消息内容不能为空") + private String messageContent; + + /** + * 网格id-居民端用 + */ + @NotBlank(message = "网格id不能为空") + private String gridId; + + /** + * 已读标记 + */ + @NotBlank(message = "已读标记不能为空") + private String readFlag; + + /** + * 调用方 + */ + @NotBlank(message = "调用方不能为空") + private String referer; + + /** + * 推送微信订阅Flag + */ + @NotBlank(message = "是否推送订阅Flag不能为空") + private String pushWxmpFlag; + +} diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/result/WxMsgAuthInfoResultDTO.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/result/WxMsgAuthInfoResultDTO.java index 13988b5411..52e8d95284 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/result/WxMsgAuthInfoResultDTO.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/result/WxMsgAuthInfoResultDTO.java @@ -38,4 +38,9 @@ public class WxMsgAuthInfoResultDTO { * wx订阅状态 订阅状态(订阅:subscribe 取消订阅:unsubscribe) */ private String wxSubscribeStatus; + + /** + * 微信openId + */ + private String wxOpenId; } diff --git a/epmet-module/epmet-message/epmet-message-server/deploy/docker-compose-dev.yml b/epmet-module/epmet-message/epmet-message-server/deploy/docker-compose-dev.yml index 5ab5ecb83d..846f37b811 100644 --- a/epmet-module/epmet-message/epmet-message-server/deploy/docker-compose-dev.yml +++ b/epmet-module/epmet-message/epmet-message-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-message-server: container_name: epmet-message-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/epmet-message-server:0.3.28 + image: 192.168.1.130:10080/epmet-cloud-dev/epmet-message-server:version_placeholder ports: - "8085:8085" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-message/epmet-message-server/deploy/docker-compose-prod.yml b/epmet-module/epmet-message/epmet-message-server/deploy/docker-compose-prod.yml index 67da25bdf4..45405c1456 100644 --- a/epmet-module/epmet-message/epmet-message-server/deploy/docker-compose-prod.yml +++ b/epmet-module/epmet-message/epmet-message-server/deploy/docker-compose-prod.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-message-server: container_name: epmet-message-server-prod - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-master/epmet-message-server:0.3.28 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-master/epmet-message-server:0.3.29 ports: - "8085:8085" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-message/epmet-message-server/deploy/docker-compose-test.yml b/epmet-module/epmet-message/epmet-message-server/deploy/docker-compose-test.yml index 7630cefa81..ad84863301 100644 --- a/epmet-module/epmet-message/epmet-message-server/deploy/docker-compose-test.yml +++ b/epmet-module/epmet-message/epmet-message-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-message-server: container_name: epmet-message-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-message-server:0.3.27 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-message-server:version_placeholder ports: - "8085:8085" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-message/epmet-message-server/pom.xml b/epmet-module/epmet-message/epmet-message-server/pom.xml index 28f44f4962..594f25e502 100644 --- a/epmet-module/epmet-message/epmet-message-server/pom.xml +++ b/epmet-module/epmet-message/epmet-message-server/pom.xml @@ -2,7 +2,7 @@ 4.0.0 - 0.3.28 + 0.3.29 com.epmet epmet-message @@ -25,6 +25,11 @@ epmet-message-client 2.0.0 + + com.epmet + epmet-user-client + 2.0.0 + com.epmet epmet-admin-client @@ -160,6 +165,12 @@ false + + + 5 + 8 + 10 + 30 @@ -192,6 +203,12 @@ false + + + 5 + 8 + 10 + 30 @@ -224,6 +241,12 @@ true + + + 5 + 8 + 10 + 30 @@ -253,6 +276,12 @@ true + + + 5 + 8 + 10 + 30 diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/config/AsyncConfig.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/config/AsyncConfig.java new file mode 100644 index 0000000000..95c0b0c55a --- /dev/null +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/config/AsyncConfig.java @@ -0,0 +1,49 @@ +package com.epmet.config; + +import com.epmet.properties.ThreadProperties; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 线程池配置类 + */ +@Configuration +@EnableConfigurationProperties(ThreadProperties.class) +@EnableAsync +public class AsyncConfig { + + @Autowired + private ThreadProperties threadProperties; + + @Bean + public Executor executor() { + ThreadProperties.ThreadPoolProperties threadPoolProps = threadProperties.getThreadPool(); + + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(threadPoolProps.getCorePoolSize()); + executor.setMaxPoolSize(threadPoolProps.getMaxPoolSize()); + executor.setQueueCapacity(threadPoolProps.getQueueCapacity()); + executor.setThreadNamePrefix("epmet-message-"); + // rejection-policy:当pool已经达到max size的时候,如何处理新任务 + // CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //对拒绝task的处理策略 + executor.setKeepAliveSeconds(threadPoolProps.getKeepAlive()); + executor.initialize(); + return executor; + } + + @Bean + public ExecutorService executorService() { + ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) executor(); + return executor.getThreadPoolExecutor(); + } + +} diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/constant/ExtConstant.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/constant/ExtConstant.java new file mode 100644 index 0000000000..f8b9564e7a --- /dev/null +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/constant/ExtConstant.java @@ -0,0 +1,11 @@ +package com.epmet.constant; + +public interface ExtConstant { + String APP_RESI = "resi"; + + String APP_WORK = "work"; + + String APP_GOV = "gov"; + + String PUSH_WXMP = "1"; +} diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/constant/WxmpMessageConstant.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/constant/WxmpMessageConstant.java index 667a8b3bfc..62c9e16dcb 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/constant/WxmpMessageConstant.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/constant/WxmpMessageConstant.java @@ -22,7 +22,9 @@ public interface WxmpMessageConstant { String RESI = "resi"; - String WORK = "work"; + String GOV_REDIS = "work"; + + String GOV_DB = "gov"; String ACCESS_TOKEN = "access_token"; @@ -30,17 +32,21 @@ public interface WxmpMessageConstant { String TEMPLATE_ID = "template_id"; + String TEMPLATE_TYPE = "1832"; + String PAGE = "page"; - String TITLE = "title"; + String PAGE_URL = "/subpages/mine/pages/message/skip"; + + String TITLE = "thing5"; int TITLE_LIMIT = 20; - String MESSAGE_CONTENT = "message_content"; + String MESSAGE_CONTENT = "thing4"; int MESSAGE_CONTENT_LIMIT = 20; - String MESSAGE_TIME = "message_time"; + String MESSAGE_TIME = "date2"; String DATA = "data"; @@ -50,10 +56,6 @@ public interface WxmpMessageConstant { String ERROR = "error"; - String PAGE_RESI = ""; - - String PAGE_WORK = ""; - String STATE_DEV = "developer"; String STATE_TEST = "trial"; diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/WxmpMessageController.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/WxmpMessageController.java index 7e06c80b0a..b600285971 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/WxmpMessageController.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/WxmpMessageController.java @@ -17,14 +17,19 @@ package com.epmet.controller; +import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.security.user.LoginUserUtil; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.dto.form.ActivationSubscribeFormDTO; import com.epmet.dto.form.GetTemplateListFormDTO; import com.epmet.dto.form.WxMsgAuthInfoFormDTO; import com.epmet.dto.form.WxSubscribeMessageFormDTO; import com.epmet.dto.result.GetTemplateListResultDTO; +import com.epmet.dto.result.WxMsgAuthInfoResultDTO; import com.epmet.service.WxmpMessageService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -32,6 +37,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.concurrent.ExecutorService; /** @@ -44,12 +50,17 @@ import java.util.List; @RequestMapping("wxmpmessage") public class WxmpMessageController { + private Logger logger = LoggerFactory.getLogger(getClass()); + @Autowired private WxmpMessageService wxmpMessageService; @Autowired private LoginUserUtil loginUserUtil; + @Autowired + private ExecutorService executorService; + /** * @Description 保存系统自身的弹框授权信息 * @return com.epmet.commons.tools.utils.Result @@ -64,17 +75,28 @@ public class WxmpMessageController { String clientType = form.getClientType(); String customerId = form.getCustomerId(); String subscribeStatus = form.getSubscribeStatus(); + String templateId = form.getTemplateId(); - wxmpMessageService.saveSysAuthorizeInfo(customerId, clientType, alwaysVisit, subscribeStatus, loginUserUtil.getLoginUserId()); + wxmpMessageService.saveSysAuthorizeInfo(customerId, clientType, alwaysVisit, subscribeStatus, loginUserUtil.getLoginUserId(), templateId); return new Result(); } + @PostMapping("sendwxsubscribemessage") public Result sendWxSubscribeMessage(@RequestBody List msgList){ for (WxSubscribeMessageFormDTO wxSubscribeMessageFormDTO : msgList) { ValidatorUtils.validateEntity(wxSubscribeMessageFormDTO); } - wxmpMessageService.sendWxSubscribeMessage(msgList); + executorService.execute(() -> { + try { + long startTs = System.currentTimeMillis(); + wxmpMessageService.sendWxSubscribeMessage(msgList); + long endTs = System.currentTimeMillis(); + logger.info("异步发送消息成功,执行时长:{}", endTs - startTs); + } catch (Exception e) { + logger.error("异步发送消息失败,错误信息:{}", ExceptionUtils.getErrorStackTrace(e)); + } + }); return new Result(); } @@ -89,4 +111,52 @@ public class WxmpMessageController { return new Result>().ok(wxmpMessageService.templateList(formDTO)); } -} + /** + * @Description 查询用户授权信息 + * @return + * @author wxz + * @date 2020.10.21 18:15 + */ + @PostMapping("get-authorizeinfo") + public Result getAuthorizationInfo(@RequestBody WxMsgAuthInfoFormDTO form) { + ValidatorUtils.validateEntity(form, WxMsgAuthInfoFormDTO.GetAuthInfoGroup.class); + WxMsgAuthInfoResultDTO authorizationInfo = wxmpMessageService.getAuthorizationInfo( + form.getCustomerId(), form.getClientType(), + loginUserUtil.getLoginUserId(), form.getTemplateId()); + return new Result().ok(authorizationInfo); + } + + /** + * 保存微信订阅的授权信息 + * @param form + * @return + */ + @PostMapping("save-wxsubscribe") + public Result saveWxSubscribe(@RequestBody WxMsgAuthInfoFormDTO form) { + ValidatorUtils.validateEntity(form, WxMsgAuthInfoFormDTO.SaveWxSubscribeInfoGroup.class); + String customerId = form.getCustomerId(); + String clientType = form.getClientType(); + String templateId = form.getTemplateId(); + String wxAlwaysVisit = form.getWxAlwaysVisit(); + String wxSubscribeStatus = form.getWxSubscribeStatus(); + String behaviorType = form.getBehaviorType(); + + wxmpMessageService.saveWxSubscribe(customerId, clientType, templateId, wxAlwaysVisit, wxSubscribeStatus, behaviorType, loginUserUtil.getLoginUserId()); + + return new Result(); + } + + /** + * @return + * @Description 居民端、工作端-重新激活授权页 + * @author sun + */ + @PostMapping("activationsubscribe") + public Result activationSubscribe(@RequestBody ActivationSubscribeFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO, ActivationSubscribeFormDTO.UpdateWxSubscribeInfoGroup.class); + formDTO.setUserId(loginUserUtil.getLoginUserId()); + wxmpMessageService.activationSubscribe(formDTO); + return new Result(); + } + +} \ No newline at end of file diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/WxmpMessageExtController.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/WxmpMessageExtController.java new file mode 100644 index 0000000000..330bda57bb --- /dev/null +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/WxmpMessageExtController.java @@ -0,0 +1,69 @@ +package com.epmet.controller; + +import com.epmet.commons.tools.constant.AppClientConstant; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.dto.form.WxmpMessagePushFormDTO; +import com.epmet.dto.form.WxmpTemplateListFormDTO; +import com.epmet.dto.result.WxmpTemplateListResultDTO; +import com.epmet.service.WxmpMessageExtService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.concurrent.ExecutorService; + +/** + * @description: 外部调用微信订阅controller + * @author: liushaowen + * @date: 2020/11/2 14:51 + */ +@RestController +@RequestMapping("template") +public class WxmpMessageExtController { + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private WxmpMessageExtService wxmpMessageExtService; + + @Autowired + private ExecutorService executorService; + + @PostMapping("msgpush") + public Result wxmpMsgPush(@RequestBody List dtos){ + for (WxmpMessagePushFormDTO dto : dtos) { + ValidatorUtils.validateEntity(dto); + } + executorService.execute(() -> { + try { + long startTs = System.currentTimeMillis(); + wxmpMessageExtService.pushWxmpMessage(dtos); + long endTs = System.currentTimeMillis(); + logger.info("异步发送消息成功,执行时长:{}", endTs - startTs); + } catch (Exception e) { + logger.error("异步发送消息失败,错误信息:{}", ExceptionUtils.getErrorStackTrace(e)); + } + }); + return new Result(); + } + + /** + * @return + * @Description (外挂)消息-获取订阅消息模板列表 + * @author sun + */ + @PostMapping("wxmptemplatelist") + public Result> wxmpTemplateList(@RequestBody WxmpTemplateListFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO, WxmpTemplateListFormDTO.AddUserInternalGroup.class); + if (!AppClientConstant.APP_RESI.equals(formDTO.getClientType()) && !AppClientConstant.APP_WORK.equals(formDTO.getClientType())) { + return new Result>().error("参数错误,clientType值类型错误!"); + } + return new Result>().ok(wxmpMessageExtService.wxmpTemplateList(formDTO)); + } +} diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/WxmpResiUserSubscribeDao.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/WxmpResiUserSubscribeDao.java index c1a6e83d2f..f103867708 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/WxmpResiUserSubscribeDao.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/WxmpResiUserSubscribeDao.java @@ -36,11 +36,12 @@ public interface WxmpResiUserSubscribeDao extends BaseDao { WxMsgAuthInfoResultDTO getUserSubscribeStatusDTO(@Param("userId") String userId, - @Param("customerId") String customerId, - @Param("clientType") String clientType); + @Param("customerId") String customerId, + @Param("clientType") String clientType, + @Param("templateId") String templateId, + @Param("openId") String openId); WxmpTemplateMsgSubscribeStatusEntity getUserSubscribeStatusEntity(@Param("userId") String userId, - @Param("customerId") String customerId, - @Param("clientType") String clientType); + @Param("customerId") String customerId, + @Param("clientType") String clientType, + @Param("templateId") String templateId, + @Param("openId") String openId); + + /** + * @return + * @Description 更新用户授权信息 + * + * @author sun + */ + int updateUserSubscribe(ActivationSubscribeFormDTO formDTO); } \ No newline at end of file diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/WxmpWorkUserSubscribeDao.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/WxmpWorkUserSubscribeDao.java index 0638e2bfc4..c5e2394835 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/WxmpWorkUserSubscribeDao.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/WxmpWorkUserSubscribeDao.java @@ -36,11 +36,12 @@ public interface WxmpWorkUserSubscribeDao extends BaseDao getAuthorizerRefreshToken(String key){ + logger.info("发送微信订阅消息,获取accesstoken的key值:" + key); Map result = redisUtils.hGetAll("epmet:wechartthird:authorizerrefreshtoken:" + key); return result; } diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/WxmpMessageExtService.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/WxmpMessageExtService.java new file mode 100644 index 0000000000..598c992667 --- /dev/null +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/WxmpMessageExtService.java @@ -0,0 +1,20 @@ +package com.epmet.service; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.form.WxmpMessagePushFormDTO; +import com.epmet.dto.form.WxmpTemplateListFormDTO; +import com.epmet.dto.result.WxmpTemplateListResultDTO; + +import java.util.List; + +public interface WxmpMessageExtService { + + Result pushWxmpMessage(List dto); + + /** + * @return + * @Description 消息-获取订阅消息模板列表 + * @author sun + */ + List wxmpTemplateList(WxmpTemplateListFormDTO formDTO); +} diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/WxmpMessageService.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/WxmpMessageService.java index fdde63f2a5..315bf5c6d6 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/WxmpMessageService.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/WxmpMessageService.java @@ -17,9 +17,11 @@ package com.epmet.service; +import com.epmet.dto.form.ActivationSubscribeFormDTO; import com.epmet.dto.form.GetTemplateListFormDTO; import com.epmet.dto.form.WxSubscribeMessageFormDTO; import com.epmet.dto.result.GetTemplateListResultDTO; +import com.epmet.dto.result.WxMsgAuthInfoResultDTO; import java.util.List; @@ -31,7 +33,12 @@ import java.util.List; */ public interface WxmpMessageService { - void saveSysAuthorizeInfo(String customerId, String clientType, String alwaysVisit, String subscribeStatus, String userId); + void saveSysAuthorizeInfo(String customerId, String clientType, String alwaysVisit, String subscribeStatus, String userId, String templateId); + + WxMsgAuthInfoResultDTO getAuthorizationInfo(String customerId, String clientType, String loginUserId, String templateId); + + void saveWxSubscribe(String customerId, String clientType, String templateId, String wxAlwaysVisit, String wxSubscribeStatus, + String behaviorType, String userId); /** * @Description 发送订阅消息 @@ -48,4 +55,11 @@ public interface WxmpMessageService { * @author sun */ List templateList(GetTemplateListFormDTO formDTO); + + /** + * @return + * @Description 居民端、工作端-重新激活授权页 + * @author sun + */ + void activationSubscribe(ActivationSubscribeFormDTO formDTO); } diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/WxmpMessageExtServiceImpl.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/WxmpMessageExtServiceImpl.java new file mode 100644 index 0000000000..f9d1e17a67 --- /dev/null +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/WxmpMessageExtServiceImpl.java @@ -0,0 +1,83 @@ +package com.epmet.service.impl; + +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.constant.ExtConstant; +import com.epmet.dto.form.*; +import com.epmet.dto.result.CustomerTemplateListResultDTO; +import com.epmet.dto.result.WxmpTemplateListResultDTO; +import com.epmet.service.UserMessageService; +import com.epmet.service.WxmpMessageExtService; +import com.epmet.service.WxmpMessageService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @description: + * @author: liushaowen + * @date: 2020/11/2 14:54 + */ +@Service +public class WxmpMessageExtServiceImpl implements WxmpMessageExtService { + @Autowired + private WxmpMessageService wxmpMessageService; + @Autowired + private UserMessageService userMessageService; + @Autowired + private WxmpMessageServiceImpl wxmpMessageServiceImpl; + + @Override + public Result pushWxmpMessage(List dtos) { + List wxmpMsgList = new ArrayList<>(); + List userMsgList = new ArrayList<>(); + for (WxmpMessagePushFormDTO dto : dtos) { + //站内信 + UserMessageFormDTO userMessageFormDTO = new UserMessageFormDTO(); + BeanUtils.copyProperties(dto,userMessageFormDTO); + userMessageFormDTO.setTitle("您有一条"+dto.getTitle()); + userMsgList.add(userMessageFormDTO); + + //如果推送微信订阅flag为"1",推送微信订阅 + if (ExtConstant.PUSH_WXMP.equals(dto.getPushWxmpFlag())){ + WxSubscribeMessageFormDTO wxSubscribeMessageFormDTO = new WxSubscribeMessageFormDTO(); + BeanUtils.copyProperties(dto,wxSubscribeMessageFormDTO); + //设置ClientType + if (ExtConstant.APP_RESI.equals(dto.getApp())){ + wxSubscribeMessageFormDTO.setClientType(ExtConstant.APP_RESI); + } + if (ExtConstant.APP_GOV.equals(dto.getApp())){ + wxSubscribeMessageFormDTO.setClientType(ExtConstant.APP_WORK); + } + wxSubscribeMessageFormDTO.setBehaviorType(dto.getTitle()); + wxSubscribeMessageFormDTO.setMessageTime(new Date()); + wxmpMsgList.add(wxSubscribeMessageFormDTO); + } + } + wxmpMessageService.sendWxSubscribeMessage(wxmpMsgList); + return userMessageService.saveUserMessageList(userMsgList); + } + + /** + * @return + * @Description 消息-获取订阅消息模板列表 + * @author sun + */ + @Override + public List wxmpTemplateList(WxmpTemplateListFormDTO formDTO) { + List resultList = new ArrayList<>(); + CustomerTemplateListFormDTO dto = ConvertUtils.sourceToTarget(formDTO, CustomerTemplateListFormDTO.class); + List list = wxmpMessageServiceImpl.customerTemplateList(dto); + list.forEach(l->{ + if(formDTO.getClientType().equals(l.getClientType())){ + WxmpTemplateListResultDTO result = ConvertUtils.sourceToTarget(l, WxmpTemplateListResultDTO.class); + resultList.add(result); + } + }); + return resultList; + } +} diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/WxmpMessageServiceImpl.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/WxmpMessageServiceImpl.java index bf9d8ed39c..ca8aa468dc 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/WxmpMessageServiceImpl.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/WxmpMessageServiceImpl.java @@ -19,25 +19,22 @@ package com.epmet.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.epmet.commons.tools.constant.AppClientConstant; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.enums.EnvEnum; import com.epmet.commons.tools.exception.RenException; -import com.epmet.commons.tools.exception.ValidateException; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.HttpClientManager; import com.epmet.commons.tools.utils.Result; -import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.constant.WxMsgTemplateSubscribeStatus; import com.epmet.constant.WxmpMessageConstant; import com.epmet.dao.WxmpResiUserSubscribeDao; import com.epmet.dao.WxmpTemplateMsgSubscribeStatusDao; +import com.epmet.dao.WxmpUserSubscribeRecordDao; import com.epmet.dao.WxmpWorkUserSubscribeDao; -import com.epmet.dto.form.GetTemplateListFormDTO; -import com.epmet.dto.form.StaffBasicInfoFormDTO; -import com.epmet.dto.form.UserBasicInfoFormDTO; -import com.epmet.dto.form.WxSubscribeMessageFormDTO; -import com.epmet.dto.result.GetTemplateListResultDTO; -import com.epmet.entity.WxmpMsgSendRecordEntity; -import com.epmet.entity.WxmpTemplateMsgSubscribeStatusEntity; +import com.epmet.dto.form.*; +import com.epmet.dto.result.*; +import com.epmet.entity.*; import com.epmet.exception.WxSubscribeException; import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.redis.WxmpMessageRedis; @@ -48,11 +45,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -85,6 +82,9 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { @Autowired private WxmpMsgSendRecordService wxmpMsgSendRecordService; + @Autowired + private WxmpUserSubscribeRecordDao subscribeRecordDao; + /** * @return void * @Description 保存系统授权信息 @@ -92,8 +92,18 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { * @date 2020.10.21 17:29 */ @Override - public void saveSysAuthorizeInfo(String customerId, String clientType, String alwaysVisit, String subscribeStatus, String userId) { - WxmpTemplateMsgSubscribeStatusEntity userSubscribeStatusEntity = msgSubscribeStatusDao.getUserSubscribeStatusEntity(userId, customerId, clientType); + public void saveSysAuthorizeInfo(String customerId, String clientType, String alwaysVisit, String subscribeStatus, String userId, String templateId) { + String openId = null; + switch (clientType) { + case AppClientConstant.APP_GOV: + openId = getWorkOpenId(userId); + break; + case AppClientConstant.APP_RESI: + openId = getResiOpenId(userId); + break; + } + + WxmpTemplateMsgSubscribeStatusEntity userSubscribeStatusEntity = msgSubscribeStatusDao.getUserSubscribeStatusEntity(userId, customerId, clientType, templateId, openId); if (userSubscribeStatusEntity != null) { userSubscribeStatusEntity.setAlwaysVisit(alwaysVisit); userSubscribeStatusEntity.setSubscribeStatus(subscribeStatus); @@ -104,7 +114,9 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { userSubscribeStatusEntity = new WxmpTemplateMsgSubscribeStatusEntity(); userSubscribeStatusEntity.setCustomerId(customerId); userSubscribeStatusEntity.setClientType(clientType); + userSubscribeStatusEntity.setTemplateId(templateId); userSubscribeStatusEntity.setAlwaysVisit(alwaysVisit); + userSubscribeStatusEntity.setWxOpenId(openId); userSubscribeStatusEntity.setSubscribeStatus(subscribeStatus); userSubscribeStatusEntity.setUserId(userId); msgSubscribeStatusDao.insert(userSubscribeStatusEntity); @@ -120,7 +132,17 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { @Override public void sendWxSubscribeMessage(List msgList) { logger.info("待发送订阅消息数量:{}", msgList.size()); + if (!(msgList.size() > NumConstant.ZERO)) { + throw new RenException("待发送消息不能为空"); + } int succecssCount = 0; +// 获取templateId + CustomerTemplateListFormDTO customerTemplateListFormDTO = new CustomerTemplateListFormDTO(); + customerTemplateListFormDTO.setCustomerId(msgList.get(0).getCustomerId()); + customerTemplateListFormDTO.setPublicId(WxmpMessageConstant.TEMPLATE_TYPE); + List customerTemplateListResultDTOS = customerTemplateList(customerTemplateListFormDTO); +// 获取AccessToken + Map accessTokenMap = getAccessToken(msgList.get(0).getCustomerId()); for (WxSubscribeMessageFormDTO msg : msgList) { try { String userId = msg.getUserId(); @@ -133,51 +155,54 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { if (WxmpMessageConstant.RESI.equals(clientType)) { UserBasicInfoFormDTO userBasicInfoFormDTO = new UserBasicInfoFormDTO(); userBasicInfoFormDTO.setUserId(userId); - openId = epmetUserOpenFeignClient.getUserBasicInfo(userBasicInfoFormDTO).getData().getOpenId(); - } else if (WxmpMessageConstant.WORK.equals(clientType)) { + Result userBasicInfo = epmetUserOpenFeignClient.getUserBasicInfo(userBasicInfoFormDTO); + if (userBasicInfo.getCode() != 0){ + throw new Exception(userBasicInfo.getInternalMsg()); + }else { + openId = userBasicInfo.getData().getOpenId(); + } + } else if (WxmpMessageConstant.GOV_DB.equals(clientType)) { StaffBasicInfoFormDTO staffBasicInfoFormDTO = new StaffBasicInfoFormDTO(); staffBasicInfoFormDTO.setStaffId(userId); - openId = epmetUserOpenFeignClient.getStaffBasicInfo(staffBasicInfoFormDTO).getData().getOpenId(); + Result staffBasicInfo = epmetUserOpenFeignClient.getStaffBasicInfo(staffBasicInfoFormDTO);; + if (staffBasicInfo.getCode() != 0){ + throw new Exception(staffBasicInfo.getInternalMsg()); + }else { + openId = staffBasicInfo.getData().getOpenId(); + } } else { throw new WxSubscribeException("clientType有误", "", openId); } } catch (Exception e) { - throw new WxSubscribeException("连接User服务失败", "", ""); + e.printStackTrace(); + throw new WxSubscribeException("获取openId失败:" + e.getMessage(), "", ""); } if (StringUtils.isBlank(openId)) { - throw new WxSubscribeException("openId获取失败", "", ""); + throw new WxSubscribeException("该userId未查询到关联的openId", "", ""); } - - //获取accessToken - StringBuilder key = new StringBuilder(msg.getCustomerId()).append(":").append(msg.getClientType()); - Map authorizerRefreshToken = new HashMap<>(); - try { - authorizerRefreshToken = wxmpMessageRedis.getAuthorizerRefreshToken(key.toString()); - } catch (Exception e) { - throw new WxSubscribeException("连接缓存服务器失败", "", openId); - } - String accessToken = (String) authorizerRefreshToken.get(WxmpMessageConstant.AUTHORIZER_ACCESS_TOKEN); - if (StringUtils.isBlank(accessToken)) { - throw new WxSubscribeException("accessToken获取失败", "", openId); - } - //获取模板id - if (WxmpMessageConstant.RESI.equals(clientType)) { - templateId = wxmpResiUserSubscribeDao.getResiSubscribeTemplateId(openId, templateId, customerId); - } else if (WxmpMessageConstant.WORK.equals(clientType)) { - templateId = wxmpWorkUserSubscribeDao.getWorkSubscribeTemplateId(openId, templateId, customerId); + if (customerTemplateListResultDTOS.size() > NumConstant.ZERO) { + for (CustomerTemplateListResultDTO customerTemplateListResultDTO : customerTemplateListResultDTOS) { + if (WxmpMessageConstant.GOV_REDIS.equals(customerTemplateListResultDTO.getClientType())) { + customerTemplateListResultDTO.setClientType(WxmpMessageConstant.GOV_DB); + } + if (clientType.equals(customerTemplateListResultDTO.getClientType())) { + templateId = customerTemplateListResultDTO.getTemplateId(); + } + } + } else { + throw new WxSubscribeException("获取模板id失败", "", openId); } if (StringUtils.isBlank(templateId)) { throw new WxSubscribeException("获取模板id失败", "", openId); } - //判断用户是否有次数 Integer count = null; if (WxmpMessageConstant.RESI.equals(clientType)) { - count = wxmpResiUserSubscribeDao.getResiSubscribeInfo(openId, templateId, customerId); - } else if (WxmpMessageConstant.WORK.equals(clientType)) { - count = wxmpWorkUserSubscribeDao.getWorkSubscribeInfo(openId, templateId, customerId); + count = wxmpResiUserSubscribeDao.getResiSubscribeInfo(openId, templateId, customerId, userId); + } else if (WxmpMessageConstant.GOV_DB.equals(clientType)) { + count = wxmpWorkUserSubscribeDao.getWorkSubscribeInfo(openId, templateId, customerId, userId); } if (count == null) { //用户未订阅 @@ -187,6 +212,17 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { throw new WxSubscribeException("用户可用额度不足", templateId, openId); } + //获取accessToken + String accessToken = null; + if (WxmpMessageConstant.RESI.equals(clientType)) { + accessToken = accessTokenMap.get("resiToken"); + } else if (WxmpMessageConstant.GOV_DB.equals(clientType)) { + accessToken = accessTokenMap.get("govToken"); + } + if (StringUtils.isBlank(accessToken)) { + throw new WxSubscribeException("accessToken获取失败"+accessTokenMap.get("errorMsg"), "", openId); + } + //发送消息 JSONObject jsonObject = new JSONObject(); JSONObject data = new JSONObject(); @@ -194,16 +230,30 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { jsonObject.put(WxmpMessageConstant.ACCESS_TOKEN, accessToken); jsonObject.put(WxmpMessageConstant.TOUSER, openId); jsonObject.put(WxmpMessageConstant.TEMPLATE_ID, templateId); - data.put(WxmpMessageConstant.TITLE, new JSONObject().put("value", ("您有一条" + msg.getBehaviorType()).substring(0, WxmpMessageConstant.TITLE_LIMIT))); - data.put(WxmpMessageConstant.MESSAGE_CONTENT, new JSONObject().put("value", msg.getMessageContent().substring(0, WxmpMessageConstant.MESSAGE_CONTENT_LIMIT))); - data.put(WxmpMessageConstant.MESSAGE_TIME, new JSONObject().put("value", new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()))); + //标题 + String title = "您有一条" + msg.getBehaviorType(); + JSONObject titleJson = new JSONObject(); + titleJson.put("value", title.length() > WxmpMessageConstant.TITLE_LIMIT ? title.substring(0, WxmpMessageConstant.TITLE_LIMIT) : title); + data.put(WxmpMessageConstant.TITLE, titleJson); + //内容 + JSONObject contentJson = new JSONObject(); + contentJson.put("value", msg.getMessageContent().length() > WxmpMessageConstant.MESSAGE_CONTENT_LIMIT ? msg.getMessageContent().substring(0, WxmpMessageConstant.MESSAGE_CONTENT_LIMIT) : msg.getMessageContent()); + data.put(WxmpMessageConstant.MESSAGE_CONTENT, contentJson); + //时间 + JSONObject timeJson = new JSONObject(); + timeJson.put("value", new SimpleDateFormat("yyyy-MM-dd HH:mm").format(msg.getMessageTime())); + data.put(WxmpMessageConstant.MESSAGE_TIME, timeJson); jsonObject.put(WxmpMessageConstant.DATA, data); EnvEnum envEnum = EnvEnum.getCurrentEnv(); //选填项 if (WxmpMessageConstant.RESI.equals(clientType)) { - jsonObject.put(WxmpMessageConstant.PAGE, WxmpMessageConstant.PAGE_RESI); - } else if (WxmpMessageConstant.WORK.equals(clientType)) { - jsonObject.put(WxmpMessageConstant.PAGE, WxmpMessageConstant.PAGE_WORK); + StringBuilder resiPage = new StringBuilder(WxmpMessageConstant.PAGE_URL); + resiPage.append("?customerId=").append(customerId).append("&gridId=").append(msg.getGridId()); + jsonObject.put(WxmpMessageConstant.PAGE, resiPage.toString()); + } else if (WxmpMessageConstant.GOV_DB.equals(clientType)) { + StringBuilder govPage = new StringBuilder(WxmpMessageConstant.PAGE_URL); + govPage.append("?customerId=").append(customerId).append("&staffId=").append(userId); + jsonObject.put(WxmpMessageConstant.PAGE, govPage.toString()); } //开发环境 if ("dev".equals(envEnum.getCode())) { @@ -223,9 +273,9 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { //订阅条数-1 int decrease = 0; if (WxmpMessageConstant.RESI.equals(clientType)) { - decrease = wxmpResiUserSubscribeDao.decreaseResiSubscribeCount(openId, templateId, customerId, 1); - } else if (WxmpMessageConstant.WORK.equals(clientType)) { - decrease = wxmpWorkUserSubscribeDao.decreaseWorkSubscribeCount(openId, templateId, customerId, 1); + decrease = wxmpResiUserSubscribeDao.decreaseResiSubscribeCount(openId, templateId, customerId, 1,userId); + } else if (WxmpMessageConstant.GOV_DB.equals(clientType)) { + decrease = wxmpWorkUserSubscribeDao.decreaseWorkSubscribeCount(openId, templateId, customerId, 1,userId); } if (decrease == 0) { logger.error("消息{}发送成功但订阅条数-1失败", JSON.toJSONString(msg)); @@ -241,9 +291,9 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { if (errcode.equals(WxmpMessageConstant.USER_REFUSED)) { int clear = 0; if (WxmpMessageConstant.RESI.equals(clientType)) { - clear = wxmpResiUserSubscribeDao.clearResiSubscribeCount(openId, templateId, customerId); - } else if (WxmpMessageConstant.WORK.equals(clientType)) { - clear = wxmpWorkUserSubscribeDao.clearWorkSubscribeCount(openId, templateId, customerId); + clear = wxmpResiUserSubscribeDao.clearResiSubscribeCount(openId, templateId, customerId,userId); + } else if (WxmpMessageConstant.GOV_DB.equals(clientType)) { + clear = wxmpWorkUserSubscribeDao.clearWorkSubscribeCount(openId, templateId, customerId,userId); } if (clear == 0) { logger.error("消息{}发送失败且清空订阅条数失败", JSON.toJSONString(msg)); @@ -251,9 +301,8 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { } //抛出错误 - throw new WxSubscribeException(String.valueOf(resultMap.get(WxmpMessageConstant.ERR_MSG)),templateId, openId); + throw new WxSubscribeException(String.valueOf(resultMap.get(WxmpMessageConstant.ERR_MSG)), templateId, openId); } - succecssCount++; } catch (Exception e) { String errMsg = e.getMessage(); @@ -284,39 +333,326 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { wxmpMsgSendRecordEntity.setCustomerId(msg.getCustomerId()); wxmpMsgSendRecordEntity.setClientType(msg.getClientType()); wxmpMsgSendRecordEntity.setTemplateId(templateId); + wxmpMsgSendRecordEntity.setGridId(msg.getGridId() == null ? "" : msg.getGridId()); wxmpMsgSendRecordEntity.setUserId(msg.getUserId()); wxmpMsgSendRecordEntity.setWxOpenId(openId); wxmpMsgSendRecordEntity.setBehaviorType(msg.getBehaviorType()); wxmpMsgSendRecordEntity.setTitle("您有一条" + msg.getBehaviorType()); wxmpMsgSendRecordEntity.setMessageContent(msg.getMessageContent()); - wxmpMsgSendRecordEntity.setMessageTime(new Date()); + wxmpMsgSendRecordEntity.setMessageTime(msg.getMessageTime()); wxmpMsgSendRecordEntity.setResult(status); + wxmpMsgSendRecordEntity.setReferer(msg.getReferer()); return wxmpMsgSendRecordEntity; } - /** - * @return - * @Description 居民端、工作端-获取客户小程序模板列表 - * @author sun - */ - @Override - public List templateList(GetTemplateListFormDTO formDTO) { - GetTemplateListFormDTO dto = ConvertUtils.sourceToTarget(formDTO, GetTemplateListFormDTO.class); - String url = "https://epmet-cloud.elinkservice.cn/api/third/personaltemplate/templatelist"; - //String url = "http://localhost:8080/api/third/personaltemplate/templatelist"; - String data = HttpClientManager.getInstance().sendPostByJSON(url, JSON.toJSONString(dto)).getData(); - logger.info("ThirdLoginServiceImpl.getUserWeChat:httpclient->url:"+url+",结果->"+data); - JSONObject toResult = JSON.parseObject(data); - Result mapToResult = ConvertUtils.mapToEntity(toResult, Result.class); - if (null != toResult.get("code")) { - mapToResult.setCode(((Integer) toResult.get("code")).intValue()); - } - if (!mapToResult.success()) { - logger.error("调用epmet_third服务获取小程序消息订阅模板数据失败"); - throw new RenException(mapToResult.getCode()); - } - List resultList = (List) mapToResult.getData(); - return resultList; - } + //获取AccessToken + private Map getAccessToken(String customerId) { + EnvEnum envEnum = EnvEnum.getCurrentEnv(); + String resiAccessToken = null; + String govAccessToken = null; + String errorMsg = null; + if (EnvEnum.PROD.getCode().equals(envEnum.getCode())) { + //居民端 + StringBuilder resiKey = new StringBuilder(customerId).append(":").append(WxmpMessageConstant.RESI); + Map authorizerRefreshToken = new HashMap<>(); + try { + authorizerRefreshToken = wxmpMessageRedis.getAuthorizerRefreshToken(resiKey.toString()); + } catch (Exception e) { + errorMsg = e.getMessage(); + } + resiAccessToken = (String) authorizerRefreshToken.get(WxmpMessageConstant.AUTHORIZER_ACCESS_TOKEN); + //政府端 + StringBuilder govKey = new StringBuilder(customerId).append(":").append(WxmpMessageConstant.GOV_REDIS); + authorizerRefreshToken = new HashMap<>(); + try { + authorizerRefreshToken = wxmpMessageRedis.getAuthorizerRefreshToken(resiKey.toString()); + } catch (Exception e) { + errorMsg = e.getMessage(); + } + govAccessToken = (String) authorizerRefreshToken.get(WxmpMessageConstant.AUTHORIZER_ACCESS_TOKEN); + } else { + String url = "https://epmet-cloud.elinkservice.cn/api/third/pacustomer/tokenlist"; + JSONObject postData = new JSONObject(); + postData.put("customerId", customerId); + String data = HttpClientManager.getInstance().sendPostByJSON(url, JSON.toJSONString(postData)).getData(); + JSONObject toResult = JSON.parseObject(data); + Result mapToResult = ConvertUtils.mapToEntity(toResult, Result.class); + if (null != toResult.get("code")) { + mapToResult.setCode(((Integer) toResult.get("code")).intValue()); + } + if (!mapToResult.success()) { + errorMsg = StringUtils.isBlank(mapToResult.getMsg()) ? mapToResult.getInternalMsg() : mapToResult.getMsg(); + } + Object CustomerTokensResultDTO = mapToResult.getData(); + JSONObject json = JSON.parseObject(CustomerTokensResultDTO.toString()); + CustomerTokensResultDTO customerTokensResultDTO = ConvertUtils.mapToEntity(json, CustomerTokensResultDTO.class); + resiAccessToken = customerTokensResultDTO.getResiAuthorizerToken(); + govAccessToken = customerTokensResultDTO.getWorkAuthorizerToken(); + } + Map resultMap = new HashMap(); + resultMap.put("resiToken",resiAccessToken); + resultMap.put("govToken",govAccessToken); + resultMap.put("errorMsg",errorMsg); + return resultMap; + } + + /** + * @return + * @Description 居民端、工作端-获取客户小程序模板列表 + * @author sun + */ + @Override + public List templateList(GetTemplateListFormDTO formDTO) { + GetTemplateListFormDTO dto = ConvertUtils.sourceToTarget(formDTO, GetTemplateListFormDTO.class); + String url = "https://epmet-cloud.elinkservice.cn/api/third/personaltemplate/templatelist"; + //String url = "http://localhost:8080/api/third/personaltemplate/templatelist"; + String data = HttpClientManager.getInstance().sendPostByJSON(url, JSON.toJSONString(dto)).getData(); + logger.info("ThirdLoginServiceImpl.getUserWeChat:httpclient->url:" + url + ",结果->" + data); + JSONObject toResult = JSON.parseObject(data); + Result mapToResult = ConvertUtils.mapToEntity(toResult, Result.class); + if (null != toResult.get("code")) { + mapToResult.setCode(((Integer) toResult.get("code")).intValue()); + } + if (!mapToResult.success()) { + logger.error("调用epmet_third服务获取小程序消息订阅模板数据失败"); + throw new RenException(mapToResult.getCode()); + } + List resultList = (List) mapToResult.getData(); + return resultList; + /*List resultList = (List) mapToResult.getData(); + List list = new ArrayList<>(); + //必须转换 + for(Object f:resultList){ + JSONObject json = JSON.parseObject(f.toString()); + CustomerTemplateListResultDTO ff = ConvertUtils.mapToEntity(json, CustomerTemplateListResultDTO.class); + list.add(ff); + } + return list;*/ + } + + /** + * @return + * @Description 查询客户两个端小程序对应的站内信模板Id + * @author sun + */ + public List customerTemplateList(CustomerTemplateListFormDTO formDTO) { + String url = "https://epmet-cloud.elinkservice.cn/api/third/personaltemplate/customertemplatelist"; + String data = HttpClientManager.getInstance().sendPostByJSON(url, JSON.toJSONString(formDTO)).getData(); + logger.info("ThirdLoginServiceImpl.customerTemplateList:httpclient->url:" + url + ",结果->" + data); + JSONObject toResult = JSON.parseObject(data); + Result mapToResult = ConvertUtils.mapToEntity(toResult, Result.class); + if (null != toResult.get("code")) { + mapToResult.setCode(((Integer) toResult.get("code")).intValue()); + } + if (!mapToResult.success()) { + logger.error("调用epmet_third服务获取客户小程序消息订阅模板数据失败"); + throw new RenException(mapToResult.getCode()); + } + List resultList = (List) mapToResult.getData(); + List list = new ArrayList<>(); + //必须转换 + for (Object f : resultList) { + JSONObject json = JSON.parseObject(f.toString()); + CustomerTemplateListResultDTO ff = ConvertUtils.mapToEntity(json, CustomerTemplateListResultDTO.class); + list.add(ff); + } + return list; + } + + @Override + public WxMsgAuthInfoResultDTO getAuthorizationInfo(String customerId, String clientType, String loginUserId, String templateId) { + String openId = null; + switch (clientType) { + case AppClientConstant.APP_RESI: + openId = getResiOpenId(loginUserId); + break; + case AppClientConstant.APP_GOV: + openId = getWorkOpenId(loginUserId); + break; + } + return msgSubscribeStatusDao.getUserSubscribeStatusDTO(loginUserId, customerId, clientType, templateId, openId); + } + + @Transactional + @Override + public void saveWxSubscribe(String customerId, String clientType, String templateId, String wxAlwaysVisit, + String wxSubscribeStatus, String behaviorType, String userId) { + + String openId; + // 1. 用户订阅信息表新增或者更新 + if (AppClientConstant.APP_GOV.equals(clientType)) { + // 工作端 + openId = getWorkOpenId(userId); + saveWxWorkSubscribe(customerId, templateId, wxSubscribeStatus, userId, openId, wxAlwaysVisit); + } else { + //居民端 + openId = getResiOpenId(userId); + saveWxResiSubscribe(customerId, templateId, wxSubscribeStatus, userId, openId, wxAlwaysVisit); + } + + // 2.保存行为记录 + WxmpUserSubscribeRecordEntity record = new WxmpUserSubscribeRecordEntity(); + record.setBehaviorType(behaviorType); + record.setCustomerId(customerId); + record.setTemplateId(templateId); + record.setUserId(userId); + record.setWxAlwaysVisit(wxAlwaysVisit); + record.setWxOpenId(openId); + record.setWxSubscribeStatus(wxSubscribeStatus); + subscribeRecordDao.insert(record); + + // 3.更新用户模板订阅状态 + WxmpTemplateMsgSubscribeStatusEntity subscribeStatusEntity = msgSubscribeStatusDao.getUserSubscribeStatusEntity(userId, customerId, clientType, templateId, openId); + if (subscribeStatusEntity == null) { + subscribeStatusEntity = new WxmpTemplateMsgSubscribeStatusEntity(); + subscribeStatusEntity.setUserId(userId); + subscribeStatusEntity.setWxSubscribeStatus(wxSubscribeStatus); + subscribeStatusEntity.setTemplateId(templateId); + subscribeStatusEntity.setWxAlwaysVisit(wxAlwaysVisit); + subscribeStatusEntity.setCustomerId(customerId); + subscribeStatusEntity.setClientType(clientType); + subscribeStatusEntity.setWxOpenId(openId); + msgSubscribeStatusDao.insert(subscribeStatusEntity); + return; + } + + subscribeStatusEntity.setWxAlwaysVisit(wxAlwaysVisit); + subscribeStatusEntity.setWxSubscribeStatus(wxSubscribeStatus); + + msgSubscribeStatusDao.updateById(subscribeStatusEntity); + } + + /** + * @return void + * @Description 保存居民端微信订阅信息 + * @author wxz + * @date 2020.10.22 09:56 + */ + private void saveWxResiSubscribe(String customerId, String templateId, String wxSubscribeStatus, String userId, + String openId, String wxAlwaysVisit) { + + WxmpResiUserSubscribeEntity wxResiSubscribe = wxmpResiUserSubscribeDao.getWxResiSubscribe(userId, customerId, templateId, openId); + if (wxResiSubscribe == null) { + WxmpResiUserSubscribeEntity insert = new WxmpResiUserSubscribeEntity(); + insert.setCount(WxMsgTemplateSubscribeStatus.SUBSCRIBE.equals(wxSubscribeStatus) ? 1 : 0); + insert.setCustomerId(customerId); + insert.setTemplateId(templateId); + insert.setUserId(userId); + insert.setWxOpenId(openId); + insert.setWxSubscribeStatus(wxSubscribeStatus); + wxmpResiUserSubscribeDao.insert(insert); + return; + } + + if (WxMsgTemplateSubscribeStatus.SUBSCRIBE.equals(wxSubscribeStatus)) { + wxmpResiUserSubscribeDao.incrSubscribeCount(1, userId, customerId, templateId, openId); + } else if (WxMsgTemplateSubscribeStatus.UNSUBSCRIBE.equals(wxSubscribeStatus) && "yes".equals(wxAlwaysVisit)) { + // 总是+取消 + wxmpResiUserSubscribeDao.unSubscribe(userId, customerId, templateId, openId); + wxmpResiUserSubscribeDao.clearResiSubscribeCount(openId, templateId, customerId, userId); + } else { + // 取消 + wxmpResiUserSubscribeDao.unSubscribe(userId, customerId, templateId, openId); + } + } + + /** + * @return void + * @Description 保存工作端订阅信息 + * @author wxz + * @date 2020.10.22 14:21 + */ + private void saveWxWorkSubscribe(String customerId, String templateId, String wxSubscribeStatus, String userId, + String openId, String wxAlwaysVisit) { + WxmpWorkUserSubscribeEntity wxWorkSubscribe = wxmpWorkUserSubscribeDao.getWxWorkSubscribe(userId, customerId, templateId, openId); + if (wxWorkSubscribe == null) { + WxmpWorkUserSubscribeEntity insert = new WxmpWorkUserSubscribeEntity(); + insert.setCount(WxMsgTemplateSubscribeStatus.SUBSCRIBE.equals(wxSubscribeStatus) ? 1 : 0); + insert.setCustomerId(customerId); + insert.setTemplateId(templateId); + insert.setUserId(userId); + insert.setWxOpenId(openId); + insert.setWxSubscribeStatus(wxSubscribeStatus); + wxmpWorkUserSubscribeDao.insert(insert); + return; + } + + if (WxMsgTemplateSubscribeStatus.SUBSCRIBE.equals(wxSubscribeStatus)) { + wxmpWorkUserSubscribeDao.incrSubscribeCount(1, userId, customerId, templateId, openId); + } else if (WxMsgTemplateSubscribeStatus.UNSUBSCRIBE.equals(wxSubscribeStatus) && "yes".equals(wxAlwaysVisit)) { + // 取消订阅+总是 + wxmpWorkUserSubscribeDao.unSubscribe(userId, customerId, templateId, openId); + wxmpWorkUserSubscribeDao.clearWorkSubscribeCount(openId, templateId, customerId, userId); + } else { + // 取消订阅+不总是 + wxmpWorkUserSubscribeDao.unSubscribe(userId, customerId, templateId, openId); + } + + } + + /** + * @return string + * @Description 根据UserId查询居民OpenId + * @author wxz + * @date 2020.10.22 13:35 + */ + public String getResiOpenId(String userId) { + UserBasicInfoFormDTO bif = new UserBasicInfoFormDTO(); + bif.setUserId(userId); + Result result = epmetUserOpenFeignClient.getUserBasicInfo(bif); + if (!result.success()) { + throw new RenException(String.format("查询居民OpenId失败,userId:%s,错误信息:%s", userId, result.getInternalMsg())); + } + UserBasicInfo userBasicInfo = result.getData(); + if (userBasicInfo == null) { + throw new RenException(String.format("根据userId:%s,没有查询到居民OpenId", userId)); + } + return userBasicInfo.getOpenId(); + } + + /** + * @return java.lang.String + * @Description 查询工作人员openId + * @author wxz + * @date 2020.10.22 14:46 + */ + public String getWorkOpenId(String userId) { + StaffBasicInfoFormDTO form = new StaffBasicInfoFormDTO(); + form.setStaffId(userId); + Result result = epmetUserOpenFeignClient.getStaffBasicInfo(form); + if (!result.success()) { + throw new RenException(String.format("查询工作人员OpenId失败,userId:%s,错误信息:%s", userId, result.getInternalMsg())); + } + StaffBasicInfo staffBasicInfo = result.getData(); + if (staffBasicInfo == null) { + throw new RenException(String.format("根据userId:%s,没有查询到工作人员OpenId", userId)); + } + return staffBasicInfo.getOpenId(); + } + + /** + * @return + * @Description 居民端、工作端-重新激活授权页 + * @author sun + */ + @Override + public void activationSubscribe(ActivationSubscribeFormDTO formDTO) { + //1.根据所属端和用户Id查询对应的openId + String openId = ""; + if (AppClientConstant.APP_GOV.equals(formDTO.getClientType())) { + // 工作端 + openId = getWorkOpenId(formDTO.getUserId()); + } else { + //居民端 + openId = getResiOpenId(formDTO.getUserId()); + } + formDTO.setOpenId(openId); + //2.更新我们自己授权页用户授权状态 + if(msgSubscribeStatusDao.updateUserSubscribe(formDTO) - - insert into wxmp_msg_send_record - (id, - customer_id, - client_type, - template_id, - user_id, - wx_open_id, - behavior_type, - title, - message_content, - message_time, - result, - reason, - del_flag, - revision, - created_by, - created_time, - updated_by, - updated_time) - values - (MD5(replace(UUID(),'-','')), - #{customerId}, - #{clientType}, - #{templateId}, - #{userId}, - #{wxOpenId}, - #{behaviorType}, - #{title}, - #{messageContent}, - #{messageTime}, - #{result}, - #{reason}, - 0, - 0, - 'sys', - now(), - 'sys', - now() - ) - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpResiUserSubscribeDao.xml b/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpResiUserSubscribeDao.xml index 2a1df8a057..f0d302e056 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpResiUserSubscribeDao.xml +++ b/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpResiUserSubscribeDao.xml @@ -12,42 +12,78 @@ and customer_id = #{customerId} and template_id = #{templateId} and wx_open_id = #{openId} - and wx_subscribe_status = 'subscribe' + and user_id = #{userId} update Wxmp_Resi_User_Subscribe - set count = if(count 1, 0, count - ${num} ) + set count = if(count 1, 0, count - ${num} ), + UPDATED_TIME = now() where del_flag = 0 and customer_id = #{customerId} and template_id = #{templateId} and wx_open_id = #{openId} - and wx_subscribe_status = 'subscribe' + and user_id = #{userId} update Wxmp_Resi_User_Subscribe set count = 0, - wx_subscribe_status = 'unsubscribe' + UPDATED_TIME = now() where del_flag = 0 and customer_id = #{customerId} and template_id = #{templateId} and wx_open_id = #{openId} + and user_id = #{userId} - + + + update wxmp_resi_user_subscribe + set COUNT=COUNT + #{incr}, + WX_SUBSCRIBE_STATUS = 'subscribe', + UPDATED_TIME = now() + where USER_ID = #{userId} + and CUSTOMER_ID = #{customerId} + and TEMPLATE_ID = #{templateId} + and WX_OPEN_ID = #{resiOpenId} + and del_flag = 0 + + + + + update wxmp_resi_user_subscribe + set WX_SUBSCRIBE_STATUS = 'unsubscribe', + UPDATED_TIME = now() + where USER_ID = #{userId} + and CUSTOMER_ID = #{customerId} + and TEMPLATE_ID = #{templateId} + and WX_OPEN_ID = #{resiOpenId} + and del_flag = 0 + + + diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpTemplateMsgSubscribeStatusDao.xml b/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpTemplateMsgSubscribeStatusDao.xml index d1fde2360a..3be82fbb43 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpTemplateMsgSubscribeStatusDao.xml +++ b/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpTemplateMsgSubscribeStatusDao.xml @@ -17,11 +17,14 @@ created_by, created_time, updated_by, - updated_time + updated_time, + WX_OPEN_ID from wxmp_template_msg_subscribe_status status where USER_ID = #{userId} and CUSTOMER_ID = #{customerId} and CLIENT_TYPE = #{clientType} + and TEMPLATE_ID = #{templateId} + and WX_OPEN_ID = #{openId} + + + UPDATE wxmp_template_msg_subscribe_status + SET ALWAYS_VISIT = #{alwaysVisit}, + UPDATED_BY = #{userId}, + UPDATED_TIME = NOW() + WHERE + del_flag = '0' + AND customer_id = #{customerId} + AND client_type = #{clientType} + AND user_id = #{userId} + AND wx_open_id = #{openId} + AND template_id = #{templateId} + + \ No newline at end of file diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpWorkUserSubscribeDao.xml b/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpWorkUserSubscribeDao.xml index efa31174f9..2c2dafb96c 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpWorkUserSubscribeDao.xml +++ b/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpWorkUserSubscribeDao.xml @@ -2,6 +2,17 @@ + + update wxmp_work_user_subscribe + set COUNT=COUNT + #{incr}, + WX_SUBSCRIBE_STATUS = 'subscribe', + UPDATED_TIME = now() + where USER_ID = #{userId} + and CUSTOMER_ID = #{customerId} + and TEMPLATE_ID = #{templateId} + and WX_OPEN_ID = #{openId} + and del_flag =0 + update Wxmp_Work_User_Subscribe - set count = if(count < 1, 0, count - ${num} ) + set count = if(count < 1, 0, count - ${num} ), + UPDATED_TIME = now() where del_flag =0 and customer_id = #{customerId} and template_id = #{templateId} and wx_open_id = #{openId} - and wx_subscribe_status = 'subscribe' + and user_id = #{userId} update Wxmp_Work_User_Subscribe - set count = 0, - wx_subscribe_status = 'unsubscribe' + set count = 0, UPDATED_TIME = now() where del_flag =0 and customer_id = #{customerId} and template_id = #{templateId} and wx_open_id = #{openId} + and user_id = #{userId} - + + + update wxmp_work_user_subscribe + set WX_SUBSCRIBE_STATUS = 'unsubscribe', + UPDATED_TIME = now() + where USER_ID = #{userId} + and CUSTOMER_ID = #{customerId} + and TEMPLATE_ID = #{templateId} + and WX_OPEN_ID = #{workOpenId} + and del_flag =0 + + + diff --git a/epmet-module/epmet-oss/epmet-oss-server/deploy/docker-compose-dev.yml b/epmet-module/epmet-oss/epmet-oss-server/deploy/docker-compose-dev.yml index 2fa7b84b34..d99d59a73c 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/deploy/docker-compose-dev.yml +++ b/epmet-module/epmet-oss/epmet-oss-server/deploy/docker-compose-dev.yml @@ -3,7 +3,7 @@ services: epmet-oss-server: container_name: epmet-oss-server-dev # image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-dev/epmet-oss-server:0.3.2 - image: 192.168.1.130:10080/epmet-cloud-dev/epmet-oss-server:0.3.25 + image: 192.168.1.130:10080/epmet-cloud-dev/epmet-oss-server:version_placeholder ports: - "8083:8083" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-oss/epmet-oss-server/deploy/docker-compose-test.yml b/epmet-module/epmet-oss/epmet-oss-server/deploy/docker-compose-test.yml index 3a7181f4a8..f4abefb2dd 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/deploy/docker-compose-test.yml +++ b/epmet-module/epmet-oss/epmet-oss-server/deploy/docker-compose-test.yml @@ -3,7 +3,7 @@ services: epmet-oss-server: container_name: epmet-oss-server-test # image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-test/epmet-oss-server:0.3.2 - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-oss-server:0.3.24 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-oss-server:version_placeholder ports: - "8083:8083" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-oss/epmet-oss-server/pom.xml b/epmet-module/epmet-oss/epmet-oss-server/pom.xml index b73264233b..ffb777fe7c 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/pom.xml +++ b/epmet-module/epmet-oss/epmet-oss-server/pom.xml @@ -92,6 +92,10 @@ fastdfs-client ${fastdfs.version} + + org.springframework + spring-test + diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AbstractCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AbstractCloudStorageService.java index 8eb6fb6eba..fd4002d57b 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AbstractCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AbstractCloudStorageService.java @@ -11,6 +11,7 @@ package com.epmet.cloud; import com.epmet.commons.tools.utils.DateUtils; import org.apache.commons.lang3.StringUtils; +import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.UUID; @@ -75,4 +76,10 @@ public abstract class AbstractCloudStorageService { */ public abstract String uploadSuffix(InputStream inputStream, String suffix); + /** + * 文件下载 + * sun + */ + public abstract void down() throws IOException; + } diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AliyunCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AliyunCloudStorageService.java index e3c3850bff..e55449ad0f 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AliyunCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AliyunCloudStorageService.java @@ -9,10 +9,13 @@ package com.epmet.cloud; import com.aliyun.oss.OSSClient; +import com.aliyun.oss.model.DownloadFileRequest; +import com.aliyun.oss.model.DownloadFileResult; import com.epmet.commons.tools.exception.RenException; import com.epmet.exception.ModuleErrorCode; import java.io.ByteArrayInputStream; +import java.io.IOException; import java.io.InputStream; /** @@ -54,4 +57,55 @@ public class AliyunCloudStorageService extends AbstractCloudStorageService { public String uploadSuffix(InputStream inputStream, String suffix) { return upload(inputStream, getPath(config.getAliyunPrefix(), suffix)); } + + @Override + public void down() throws IOException { + OSSClient client = new OSSClient(config.getAliyunEndPoint(), config.getAliyunAccessKeyId(), + config.getAliyunAccessKeySecret()); + try { + + /* + //方式一 + File file = new File("C:/Users/Administrator/Desktop/dd/df.jpg"); + client.getObject(new GetObjectRequest(config.getAliyunBucketName(), "epmet/test/20201103/198f3c11490a44eb964c5c8e9989a507.jpg"), file);*/ + + /* + //方式二 + OSSObject oo = client.getObject(config.getAliyunBucketName(), path); + InputStream is = oo.getObjectContent(); + OutputStream os = null; + File file = new File("C:/Users/Administrator/Desktop/dd/aa.jpg"); + try { + os = new FileOutputStream(file); + int len = 0; + byte[] buffer = new byte[8192]; + while ((len = is.read(buffer)) != -1) { + os.write(buffer, 0, len); + } + } finally { + os.close(); + is.close(); + }*/ + + //方式三 + DownloadFileRequest downloadFileRequest = new DownloadFileRequest(config.getAliyunBucketName(), "epmet/test/20201103/198f3c11490a44eb964c5c8e9989a507.jpg"); + downloadFileRequest.setDownloadFile("C:/Users/Administrator/Desktop/dd/4.jpg");// 本地下载文件名称 + downloadFileRequest.setPartSize(1 * 1024 * 1024);// 分片大小,取值范围为1B~5GB。 + downloadFileRequest.setTaskNum(10);//10个任务并发下载,默认值为1 + downloadFileRequest.setEnableCheckpoint(true);// 启动断点续传 + // 下载文件 + DownloadFileResult downloadRes = client.downloadFile(downloadFileRequest); + // 下载成功时,会返回文件元信息。 + downloadRes.getObjectMetadata(); + + // 关闭OSSClient。 + client.shutdown(); + } catch (Exception e){ + throw new RenException(ModuleErrorCode.OSS_UPLOAD_FILE_ERROR, e, ""); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + + } + } diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/FastDFSCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/FastDFSCloudStorageService.java index eef3d53171..9661e5f054 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/FastDFSCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/FastDFSCloudStorageService.java @@ -15,6 +15,7 @@ import com.epmet.commons.tools.utils.SpringContextUtils; import com.epmet.exception.ModuleErrorCode; import java.io.ByteArrayInputStream; +import java.io.IOException; import java.io.InputStream; /** @@ -59,4 +60,9 @@ public class FastDFSCloudStorageService extends AbstractCloudStorageService { public String uploadSuffix(InputStream inputStream, String suffix) { return upload(inputStream, suffix); } + + @Override + public void down() throws IOException { + + } } diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/LocalCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/LocalCloudStorageService.java index 211736c173..71c17580c5 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/LocalCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/LocalCloudStorageService.java @@ -53,4 +53,9 @@ public class LocalCloudStorageService extends AbstractCloudStorageService { public String uploadSuffix(InputStream inputStream, String suffix) { return upload(inputStream, getPath(config.getLocalPrefix(), suffix)); } + + @Override + public void down() throws IOException { + + } } diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QcloudCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QcloudCloudStorageService.java index 03376f75eb..22d7da2219 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QcloudCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QcloudCloudStorageService.java @@ -83,4 +83,9 @@ public class QcloudCloudStorageService extends AbstractCloudStorageService { public String uploadSuffix(InputStream inputStream, String suffix) { return upload(inputStream, getPath(config.getQcloudPrefix(), suffix)); } + + @Override + public void down() throws IOException { + + } } diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QiniuCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QiniuCloudStorageService.java index 3c51425619..0fa9ee9f7e 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QiniuCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QiniuCloudStorageService.java @@ -77,4 +77,9 @@ public class QiniuCloudStorageService extends AbstractCloudStorageService { public String uploadSuffix(InputStream inputStream, String suffix) { return upload(inputStream, getPath(config.getQiniuPrefix(), suffix)); } + + @Override + public void down() throws IOException { + + } } diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/controller/OssController.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/controller/OssController.java index a7f37ab6e9..ff52e99ce4 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/controller/OssController.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/controller/OssController.java @@ -32,8 +32,10 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; +import org.apache.http.entity.ContentType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; +import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import springfox.documentation.annotations.ApiIgnore; @@ -41,6 +43,9 @@ import springfox.documentation.annotations.ApiIgnore; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.Arrays; import java.util.Map; @@ -252,4 +257,18 @@ public class OssController { return ossService.uploadImg(file); } + /** + * @param byteFile fileName + * @Description 外挂-文件上传 + * @Author sun + **/ + @PostMapping("ext/upload") + public Result extUpload(@RequestParam("byteFile") byte[] byteFile, @RequestParam("fileName") String fileName) throws IOException { + //public Result extUpload(@RequestParam("file") MultipartFile file, @RequestParam("fileName") String fileName) throws IOException { + //byte[] byteFile = file.getBytes(); + InputStream inputStream = new ByteArrayInputStream(byteFile); + MultipartFile filse = new MockMultipartFile(ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream); + return ossService.extUpload(filse,fileName); + } + } diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/OssService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/OssService.java index 2195e4f0f1..c67fec06f2 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/OssService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/OssService.java @@ -29,4 +29,6 @@ public interface OssService extends BaseService { int insertOssEntity(OssEntity ossEntity); Result uploadImg(MultipartFile file); + + Result extUpload(MultipartFile file, String fileName); } diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/impl/OssServiceImpl.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/impl/OssServiceImpl.java index 6ca5626490..cc44456c7e 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/impl/OssServiceImpl.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/impl/OssServiceImpl.java @@ -72,4 +72,36 @@ public class OssServiceImpl extends BaseServiceImpl implement dto.setUrl(url); return new Result().ok(dto); } + + @Override + public Result extUpload(MultipartFile file, String fileName) { + try { + OssFactory.build().down(); + } catch (IOException e) { + e.printStackTrace(); + } + + if (file.isEmpty()) { + return new Result().error(ModuleErrorCode.UPLOAD_FILE_EMPTY); + } + //上传文件 + String extension = FilenameUtils.getExtension(fileName); + String url = null; + try { + url = OssFactory.build().uploadSuffix(file.getBytes(), extension); + } catch (IOException e) { + e.printStackTrace(); + logger.error("图片上传异常"); + throw new RenException("图片上传异常"); + + } + //保存文件信息 + OssEntity ossEntity = new OssEntity(); + ossEntity.setUrl(url); + baseDao.insert(ossEntity); + //文件信息 + UploadImgResultDTO dto = new UploadImgResultDTO(); + dto.setUrl(url); + return new Result().ok(dto); + } } diff --git a/epmet-module/epmet-point/epmet-point-server/deploy/docker-compose-dev.yml b/epmet-module/epmet-point/epmet-point-server/deploy/docker-compose-dev.yml index f9c7734508..cc0bd873d0 100644 --- a/epmet-module/epmet-point/epmet-point-server/deploy/docker-compose-dev.yml +++ b/epmet-module/epmet-point/epmet-point-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-point-server: container_name: epmet-point-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/epmet-point-server:0.0.40 + image: 192.168.1.130:10080/epmet-cloud-dev/epmet-point-server:version_placeholder ports: - "8112:8112" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-point/epmet-point-server/deploy/docker-compose-test.yml b/epmet-module/epmet-point/epmet-point-server/deploy/docker-compose-test.yml index a4cc8a4af1..c8224eba1a 100644 --- a/epmet-module/epmet-point/epmet-point-server/deploy/docker-compose-test.yml +++ b/epmet-module/epmet-point/epmet-point-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-point-server: container_name: epmet-point-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-point-server:0.0.40 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-point-server:version_placeholder ports: - "8112:8112" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/form/WxmpTemplateListFormDTO.java b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/form/WxmpTemplateListFormDTO.java new file mode 100644 index 0000000000..89699ffaee --- /dev/null +++ b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/form/WxmpTemplateListFormDTO.java @@ -0,0 +1,32 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Description 消息-获取订阅消息模板列表-接口入参 + * @Author sun + */ +@Data +public class WxmpTemplateListFormDTO implements Serializable { + + /** + * 客户Id + */ + @NotBlank(message="客户Id不能为空", groups = {AddUserInternalGroup.class}) + private String customerId; + /** + * 微信公共模板库模板Id + */ + @NotBlank(message="公共模板Id不能为空", groups = {AddUserInternalGroup.class}) + private String publicId; + /** + * 所属端(居民端:resi 工作端:work) + */ + @NotBlank(message="所属端不能为空", groups = {AddUserInternalGroup.class}) + private String clientType; + public interface AddUserInternalGroup {} +} + diff --git a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/WxmpTemplateListResultDTO.java b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/WxmpTemplateListResultDTO.java new file mode 100644 index 0000000000..e6f3bc55e2 --- /dev/null +++ b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/WxmpTemplateListResultDTO.java @@ -0,0 +1,30 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description 消息-获取订阅消息模板列表-接口返参 + * @Author sun + */ +@Data +public class WxmpTemplateListResultDTO implements Serializable { + private static final long serialVersionUID = 6856602932571839314L; + + /** + * 模板Id + */ + private String templateId; + + /** + * 模板类型(站内信提醒) + */ + private String templateType; + + /** + * 所属端(居民端:resi 工作端:work) + */ + private String clientType; + +} diff --git a/epmet-module/epmet-third/epmet-third-server/deploy/docker-compose-dev.yml b/epmet-module/epmet-third/epmet-third-server/deploy/docker-compose-dev.yml index c35cda57a7..535e927003 100644 --- a/epmet-module/epmet-third/epmet-third-server/deploy/docker-compose-dev.yml +++ b/epmet-module/epmet-third/epmet-third-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-third-server: container_name: epmet-third-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/epmet-third-server:0.0.141 + image: 192.168.1.130:10080/epmet-cloud-dev/epmet-third-server:version_placeholder ports: - "8110:8110" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-third/epmet-third-server/deploy/docker-compose-prod.yml b/epmet-module/epmet-third/epmet-third-server/deploy/docker-compose-prod.yml index f01831dba3..f66482c564 100644 --- a/epmet-module/epmet-third/epmet-third-server/deploy/docker-compose-prod.yml +++ b/epmet-module/epmet-third/epmet-third-server/deploy/docker-compose-prod.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-third-server: container_name: epmet-third-server-prod - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-master/epmet-third-server:0.0.147 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-master/epmet-third-server:0.0.149 ports: - "8110:8110" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-third/epmet-third-server/deploy/docker-compose-test.yml b/epmet-module/epmet-third/epmet-third-server/deploy/docker-compose-test.yml index 13c5787cf7..2127189ea7 100644 --- a/epmet-module/epmet-third/epmet-third-server/deploy/docker-compose-test.yml +++ b/epmet-module/epmet-third/epmet-third-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-third-server: container_name: epmet-third-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-third-server:0.0.132 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-third-server:version_placeholder ports: - "8110:8110" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-third/epmet-third-server/pom.xml b/epmet-module/epmet-third/epmet-third-server/pom.xml index 050301d9f6..c6918855a7 100644 --- a/epmet-module/epmet-third/epmet-third-server/pom.xml +++ b/epmet-module/epmet-third/epmet-third-server/pom.xml @@ -2,7 +2,7 @@ 4.0.0 - 0.0.147 + 0.0.149 com.epmet diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/PersonalTemplateDao.xml b/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/PersonalTemplateDao.xml index 97452fa3b9..4cd31aeb95 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/PersonalTemplateDao.xml +++ b/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/PersonalTemplateDao.xml @@ -104,7 +104,7 @@ AND pt.customer_id = #{customerId} AND pt.tid = #{publicId} AND key_ids = #{keyIds} - ORDER BY created_time ASC + ORDER BY pt.created_time ASC SELECT id AS 'agencyId', - organization_name AS 'agencyName' + organization_name AS 'agencyName', + `level` AS 'agencyLevel' FROM customer_agency WHERE del_flag = '0' AND pid = #{pId} ORDER BY created_time DESC + LIMIT #{agencyNum} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -298,4 +381,4 @@ - + \ 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-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/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..69a2362b9d --- /dev/null +++ b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/ProjectOrgPeriodResultDTO.java @@ -0,0 +1,97 @@ +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; + + /** + * source_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-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 new file mode 100644 index 0000000000..7f19ab6754 --- /dev/null +++ b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/StaffUnHandledDTO.java @@ -0,0 +1,41 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author zhaoqifeng + * @dscription + * @date 2020/10/21 16:48 + */ +@Data +public class StaffUnHandledDTO implements Serializable { + private static final long serialVersionUID = 5257146338113364709L; + /** + * project_staff ID + */ + private String id; + /** + * 项目ID + */ + private String projectId; + /** + * 项目标题 + */ + private String title; + /** + * 工作人员ID + */ + private String staffId; + /** + * 吹哨时间 + */ + private Date createdTime; + /** + * 响应处理时间 + */ + private Date updatedTime; + +} diff --git a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/feign/GovProjectOpenFeignClient.java b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/feign/GovProjectOpenFeignClient.java index 0f89d630d4..17bd06d5df 100644 --- a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/feign/GovProjectOpenFeignClient.java +++ b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/feign/GovProjectOpenFeignClient.java @@ -2,6 +2,7 @@ package com.epmet.feign; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.form.ProcessListFormDTO; +import com.epmet.dto.ProjectDTO; import com.epmet.dto.form.ProjectListFromDTO; import com.epmet.dto.result.PendProjectListResultDTO; import com.epmet.dto.result.ProcessAndCurrentDeptResultDTO; @@ -33,6 +34,16 @@ public interface GovProjectOpenFeignClient { @PostMapping("gov/project/project/pendprojectlist") Result> getPendProjectList(@RequestBody ProjectListFromDTO fromDTO); + /** + * 滞留消息提醒定时任务 + * @author zhaoqifeng + * @date 2020/10/26 14:05 + * @param formDTO + * @return com.epmet.commons.tools.utils.Result + */ + @PostMapping("gov/project/project/sendmessagejob") + Result sendMessageJob(@RequestBody ProjectDTO formDTO); + @PostMapping("gov/project/trace/processlistnotrule") Result getProcessList(@RequestBody ProcessListFormDTO fromDTO); } diff --git a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/feign/fallback/GovProjectOpenFeignClientFallback.java b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/feign/fallback/GovProjectOpenFeignClientFallback.java index a3eb7d7e01..b0bb14a9eb 100644 --- a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/feign/fallback/GovProjectOpenFeignClientFallback.java +++ b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/feign/fallback/GovProjectOpenFeignClientFallback.java @@ -3,6 +3,7 @@ package com.epmet.feign.fallback; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.utils.ModuleUtils; import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.ProjectDTO; import com.epmet.dto.form.ProcessListFormDTO; import com.epmet.dto.form.ProjectListFromDTO; import com.epmet.dto.result.PendProjectListResultDTO; @@ -26,6 +27,19 @@ public class GovProjectOpenFeignClientFallback implements GovProjectOpenFeignCli return ModuleUtils.feignConError(ServiceConstant.GOV_PROJECT_SERVER, "getPendProjectList", fromDTO); } + /** + * 滞留消息提醒定时任务 + * + * @param formDTO + * @return com.epmet.commons.tools.utils.Result + * @author zhaoqifeng + * @date 2020/10/26 14:05 + */ + @Override + public Result sendMessageJob(ProjectDTO formDTO) { + return ModuleUtils.feignConError(ServiceConstant.GOV_PROJECT_SERVER, "sendMessageJob", formDTO); + } + @Override public Result getProcessList(ProcessListFormDTO fromDTO) { return ModuleUtils.feignConError(ServiceConstant.GOV_PROJECT_SERVER, "getProcessList", fromDTO); diff --git a/epmet-module/gov-project/gov-project-server/deploy/docker-compose-dev.yml b/epmet-module/gov-project/gov-project-server/deploy/docker-compose-dev.yml index 1d61afd8af..2293705079 100644 --- a/epmet-module/gov-project/gov-project-server/deploy/docker-compose-dev.yml +++ b/epmet-module/gov-project/gov-project-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: gov-project-server: container_name: gov-project-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/gov-project-server:0.3.43 + image: 192.168.1.130:10080/epmet-cloud-dev/gov-project-server:version_placeholder ports: - "8102:8102" network_mode: host # 使用现有网络 diff --git a/epmet-module/gov-project/gov-project-server/deploy/docker-compose-prod.yml b/epmet-module/gov-project/gov-project-server/deploy/docker-compose-prod.yml index b00690b656..cee65e15cc 100644 --- a/epmet-module/gov-project/gov-project-server/deploy/docker-compose-prod.yml +++ b/epmet-module/gov-project/gov-project-server/deploy/docker-compose-prod.yml @@ -2,7 +2,7 @@ version: "3.7" services: gov-project-server: container_name: gov-project-server-prod - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-master/gov-project-server:0.3.45 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-master/gov-project-server:0.3.46 ports: - "8102:8102" network_mode: host # 使用现有网络 diff --git a/epmet-module/gov-project/gov-project-server/deploy/docker-compose-test.yml b/epmet-module/gov-project/gov-project-server/deploy/docker-compose-test.yml index d7bf5d6939..d6c9360982 100644 --- a/epmet-module/gov-project/gov-project-server/deploy/docker-compose-test.yml +++ b/epmet-module/gov-project/gov-project-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: gov-project-server: container_name: gov-project-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/gov-project-server:0.3.39 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/gov-project-server:version_placeholder ports: - "8102:8102" network_mode: host # 使用现有网络 diff --git a/epmet-module/gov-project/gov-project-server/pom.xml b/epmet-module/gov-project/gov-project-server/pom.xml index 1d80b96d6b..06ec668460 100644 --- a/epmet-module/gov-project/gov-project-server/pom.xml +++ b/epmet-module/gov-project/gov-project-server/pom.xml @@ -2,7 +2,7 @@ - 0.3.45 + 0.3.46 gov-project com.epmet @@ -54,6 +54,12 @@ com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config + + org.apache.commons + commons-collections4 + 4.3 + compile + io.github.openfeign @@ -90,6 +96,12 @@ 2.0.0 compile + + com.epmet + oper-crm-client + 2.0.0 + compile + diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/ParameterKeyConstant.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/ParameterKeyConstant.java index 502b895544..2d5ae69fbb 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/ParameterKeyConstant.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/ParameterKeyConstant.java @@ -11,4 +11,34 @@ public interface ParameterKeyConstant { * 可滞留天数 */ String DETENTION_DAYS = "detention_days"; + + /** + * 计算方式 + */ + String CALCULATION = "calculation"; + + /** + * 计算方式-工作日 + */ + String WORK = "work"; + + /** + * 计算方式-日历天 + */ + String CALENDAR = "calendar"; + + /** + * 即将超期提醒时间 + */ + String REMIND_TIME = "remind_time"; + + /** + * 推送时间 + */ + String PUSH_TIME = "push_time"; + + /** + * 起止时间 + */ + String START_AND_END_TIME = "start_and_end_time"; } 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..d529abf12e 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 @@ -105,6 +105,10 @@ public interface ProjectConstant { * 调用user-message服务失败 */ String SAVE_MSG_EXCEPTION = "发送消息失败"; + /** + * 调用user-message服务失败 + */ + String SAVE_WXMP_MSG_EXCEPTION = "发送微信订阅消息失败"; /** * 查询项目表数据失败 */ @@ -128,4 +132,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/constant/UserMessageConstant.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/UserMessageConstant.java index 756a599ac3..9a1323f55f 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 @@ -11,14 +11,50 @@ public interface UserMessageConstant { */ String PROJECT_TITLE = "您有一条项目消息"; + /** + * 微信订阅消息部分标题 + */ + String WXMP_PROJECT_TITLE = "您有一条项目消息"; + /** * 议题转项目、项目流转、项目退回消息模板 */ - String PROJECT_RESOLVED_MSG = "您好。您收到一条【%s】的新信息,请您尽快处理。"; + String PROJECT_RESOLVED_MSG = "您收到一条【%s】的新信息,请您尽快处理。"; /** * 项目结案消息模板 */ - String PROJECT_CLOSED_MSG = "您好,您参与的【%s】项目已结案,原因:%s"; + 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..345fb495a3 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 @@ -152,4 +152,35 @@ public class ProjectController { return new Result>().ok(result); } + /** + * 滞留消息提醒 + * @author zhaoqifeng + * @date 2020/10/26 14:02 + * @param formDTO + * @return com.epmet.commons.tools.utils.Result + */ + @PostMapping("message") + public Result sendMessage(@RequestBody ProjectDTO formDTO) { + projectService.sendMessage(formDTO.getCustomerId()); + return new Result(); + } + + /** + * 滞留消息提醒定时任务 + * @author zhaoqifeng + * @date 2020/10/26 14:03 + * @param formDTO + * @return com.epmet.commons.tools.utils.Result + */ + @PostMapping("sendmessagejob") + public Result sendMessageJob(@RequestBody ProjectDTO formDTO) { + projectService.sendMessageJob(formDTO); + 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/CustomerProjectParameterDao.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/CustomerProjectParameterDao.java index c94ad69046..349b07308b 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/CustomerProjectParameterDao.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/CustomerProjectParameterDao.java @@ -18,10 +18,14 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.dto.CustomerProjectParameterDTO; import com.epmet.entity.CustomerProjectParameterEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; +import java.util.Map; + /** * 项目客户参数订制表 * @@ -38,5 +42,32 @@ public interface CustomerProjectParameterDao extends BaseDao + */ + List getParameterByCustomer(@Param("customerId") String customerId); + + /** + * 获取推送时间范围内的客户ID + * @author zhaoqifeng + * @date 2020/10/26 13:44 + * @param + * @return java.util.List + */ + CustomerProjectParameterDTO getPushTime(@Param("customerId") String customerId); + /** + * 获取默认配置 + * @author zhaoqifeng + * @date 2020/10/26 14:59 + * @param + * @return com.epmet.dto.CustomerProjectParameterDTO + */ + CustomerProjectParameterDTO getDefaultPushTime(); + + CustomerProjectParameterDTO getPushTimeConfig(@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/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 new file mode 100644 index 0000000000..b628f0cbbe --- /dev/null +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/ProjectOrgRelationDao.java @@ -0,0 +1,91 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

+ * 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.dto.ProjectOrgRelationDTO; +import com.epmet.entity.ProjectOrgRelationEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 项目机关历时关系表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2020-10-19 + */ +@Mapper +public interface ProjectOrgRelationDao extends BaseDao { + + /*** + * @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); + + /** + * @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 88bc5dadf2..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 @@ -20,6 +20,7 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.dto.ProjectStaffDTO; import com.epmet.dto.result.DepartmentResultDTO; +import com.epmet.dto.result.StaffUnHandledDTO; import com.epmet.entity.ProjectStaffEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -79,4 +80,44 @@ public interface ProjectStaffDao extends BaseDao { * @return java.util.List */ List selectCreatedProcess(ProjectStaffDTO dto); + + /** + * 获取未做处理的节点 + * @author zhaoqifeng + * @date 2020/10/21 16:56 + * @param customerId + * @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); + + /** + * @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/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/CustomerProjectParameterService.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/CustomerProjectParameterService.java index 87664dc583..c9b487e7d0 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/CustomerProjectParameterService.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/CustomerProjectParameterService.java @@ -101,4 +101,40 @@ public interface CustomerProjectParameterService extends BaseService + */ + List getParameterByCustomer(String customerId); + + /** + * 获取推送时间范围内的客户ID + * @author zhaoqifeng + * @date 2020/10/26 13:43 + * @param customerId + * @return com.epmet.dto.CustomerProjectParameterDTO + */ + CustomerProjectParameterDTO getPushTime(String customerId); + + /** + * 获取默认配置 + * @author zhaoqifeng + * @date 2020/10/26 14:58 + * @param + * @return com.epmet.dto.CustomerProjectParameterDTO + */ + CustomerProjectParameterDTO getDefaultPushTime(); + + /** + * 获取推送时间范围内的客户ID + * @author zhaoqifeng + * @date 2020/10/26 13:43 + * @param customerId + * @return com.epmet.dto.CustomerProjectParameterDTO + */ + CustomerProjectParameterDTO getPushTimeConfig(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 c8b4dfdcc7..59f41ab307 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,7 +19,6 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; -import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.dto.ProjectProcessDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; @@ -143,4 +142,13 @@ public interface ProjectProcessService extends BaseService */ ProcessAndCurrentDeptResultDTO progressAndCurrentDept(ProcessListFormDTO formDTO); + /** + * @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 9f3bfa8bf1..2050b5921e 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 @@ -188,4 +188,32 @@ public interface ProjectService extends BaseService { * @return void */ void response(ProjectResponseFormDTO formDTO); + + /** + * 项目滞留超期提醒 + * @author zhaoqifeng + * @date 2020/10/21 15:21 + * @param customerId + * @return void + */ + void sendMessage(String customerId); + + /** + * 项目滞留超期提醒定时任务 + * @author zhaoqifeng + * @date 2020/10/26 10:53 + * @param dto + * @return void + */ + void sendMessageJob(ProjectDTO dto); + + + /** + * @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 af0ee6061d..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 @@ -23,8 +23,10 @@ import com.epmet.dto.ProjectStaffDTO; import com.epmet.dto.form.DepartmentStaffListFormDTO; import com.epmet.dto.result.DepartmentResultDTO; import com.epmet.dto.result.DepartmentStaffListResultDTO; +import com.epmet.dto.result.StaffUnHandledDTO; import com.epmet.entity.ProjectStaffEntity; + import java.util.List; import java.util.Map; @@ -140,4 +142,42 @@ public interface ProjectStaffService extends BaseService { * @return java.util.List */ List getCreatedProcess(ProjectStaffDTO dto); + + /** + * 获取未做处理的节点 + * @author zhaoqifeng + * @date 2020/10/21 16:54 + * @param customerId + * @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); + + /** + * @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/CustomerProjectParameterServiceImpl.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/CustomerProjectParameterServiceImpl.java index 3df0971eb3..a3b249ab4b 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/CustomerProjectParameterServiceImpl.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/CustomerProjectParameterServiceImpl.java @@ -107,4 +107,54 @@ public class CustomerProjectParameterServiceImpl extends BaseServiceImpl + * @author zhaoqifeng + * @date 2020/10/21 14:16 + */ + @Override + public List getParameterByCustomer(String customerId) { + return baseDao.getParameterByCustomer(customerId); + } + + /** + * 获取推送时间范围内的客户ID + *@param customerId + * @return java.util.List + * @author zhaoqifeng + * @date 2020/10/26 13:43 + */ + @Override + public CustomerProjectParameterDTO getPushTime(String customerId) { + return baseDao.getPushTime(customerId); + } + + /** + * 获取默认配置 + * + * @return com.epmet.dto.CustomerProjectParameterDTO + * @author zhaoqifeng + * @date 2020/10/26 14:58 + */ + @Override + public CustomerProjectParameterDTO getDefaultPushTime() { + return baseDao.getDefaultPushTime(); + } + + /** + * 获取推送时间范围内的客户ID + * + * @param customerId + * @return com.epmet.dto.CustomerProjectParameterDTO + * @author zhaoqifeng + * @date 2020/10/26 13:43 + */ + @Override + public CustomerProjectParameterDTO getPushTimeConfig(String customerId) { + return baseDao.getPushTimeConfig(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 6af8b68c00..759d57bcb2 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,6 +36,7 @@ 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.ProjectDao; import com.epmet.dao.ProjectProcessDao; import com.epmet.dao.ProjectStaffDao; @@ -44,8 +46,11 @@ import com.epmet.dto.ProjectStaffDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.entity.ProjectEntity; +import com.epmet.entity.ProjectOrgRelationEntity; import com.epmet.entity.ProjectProcessEntity; import com.epmet.entity.ProjectStaffEntity; +import com.epmet.feign.EpmetCommonServiceOpenFeignClient; +import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.feign.EpmetUserFeignClient; import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.feign.GovOrgFeignClient; @@ -53,11 +58,15 @@ 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.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import java.util.*; import java.util.stream.Collectors; @@ -69,8 +78,10 @@ import java.util.stream.Collectors; * @since v1.0.0 2020-05-11 */ @Service +@Slf4j public class ProjectProcessServiceImpl extends BaseServiceImpl implements ProjectProcessService { + protected static final Logger logger = LoggerFactory.getLogger(ProjectProcessServiceImpl.class); @Autowired private ProjectProcessRedis projectProcessRedis; @Autowired @@ -87,6 +98,10 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl page(Map params) { @@ -223,12 +240,18 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl staffList = formDTO.getStaffList(); @@ -284,10 +307,58 @@ 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); } + + //5:调用epmet-message服务,给项目流转过程中的工作人员发送订阅的微信消息 + if (!transferWxmpMessage(formDTO).success()) { + logger.error("项目流转,推送微信订阅消息失败"); + //throw new RenException(ProjectConstant.SAVE_WXMP_MSG_EXCEPTION); + } } /** @@ -320,6 +391,37 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl msgList = new ArrayList<>(); + ProjectEntity projectEntity = projectService.selectById(formDTO.getProjectId()); + if (null == projectEntity) { + throw new RenException(ProjectConstant.SELECT_PROJECT_EXCEPTION); + } + //3:创建项目工作人员消息对象 + //所选人员如果即在部门下又在网格下则只发一条消息 + Map map = new HashMap<>(); + String projectStaffMessage = String.format(UserMessageConstant.PROJECT_RESOLVED_MSG, projectEntity.getTitle()); + formDTO.getStaffList().forEach(staff->{ + if(!map.containsKey(staff.getStaffId())){ + WxSubscribeMessageFormDTO msg = new WxSubscribeMessageFormDTO(); + msg.setCustomerId(projectEntity.getCustomerId()); + msg.setClientType(ProjectConstant.GOV); + msg.setUserId(staff.getStaffId()); + msg.setBehaviorType(UserMessageConstant.WXMP_PROJECT_TITLE); + msg.setMessageContent(projectStaffMessage); + msg.setMessageTime(new Date()); + msg.setGridId("*"); + msgList.add(msg); + map.put(staff.getStaffId(),staff.getStaffId()); + } + }); + logger.info("项目流转,推送微信订阅消息"); + return epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); + } /** * @Description 议题处理进展——已转项目 @@ -407,4 +509,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 38f5ac64a7..7808c44d57 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,13 +17,11 @@ package com.epmet.service.impl; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; -import com.epmet.commons.tools.constant.AppClientConstant; -import com.epmet.commons.tools.constant.Constant; -import com.epmet.commons.tools.constant.FieldConstant; -import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.constant.*; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; @@ -37,24 +35,29 @@ import com.epmet.constant.ParameterKeyConstant; import com.epmet.constant.ProjectConstant; import com.epmet.constant.UserMessageConstant; import com.epmet.dao.ProjectDao; +import com.epmet.dao.ProjectOrgRelationDao; import com.epmet.dto.*; import com.epmet.dto.form.*; import com.epmet.dto.result.*; -import com.epmet.entity.ProjectEntity; -import com.epmet.entity.ProjectProcessEntity; -import com.epmet.entity.ProjectRelatedPersonnelEntity; -import com.epmet.entity.ProjectStaffEntity; +import com.epmet.entity.*; import com.epmet.feign.*; import com.epmet.redis.ProjectRedis; import com.epmet.service.*; +import org.apache.commons.collections4.CollectionUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; + import java.text.SimpleDateFormat; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -64,8 +67,9 @@ import java.util.stream.Collectors; * @since v1.0.0 2020-05-11 */ @Service +@Slf4j public class ProjectServiceImpl extends BaseServiceImpl implements ProjectService { - + private Logger logger = LogManager.getLogger(ProjectServiceImpl.class); @Autowired private ProjectRedis projectRedis; @Autowired @@ -86,10 +90,16 @@ 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.setTotalPeriod(delta_t); + carrier.setHandledDate(current); + if(null == orientRelation.getFirstDealtDate()){ + carrier.setFirstReplyPeriod(delta_t); + carrier.setFirstDealtDate(current); + } + + relationDao.maintainTimePropertyConsistency(carrier); + //通知 List msgList = new ArrayList<>(); + //2020.10.26 添加项目结案发送微信订阅消息操作 sun + List wxmpMsgList = new ArrayList<>(); //通知项目相关人员 List personnelList = projectRelatedPersonnelService.getPersonnelListByProjectId(fromDTO.getProjectId()); personnelList.forEach(p -> { @@ -394,6 +460,15 @@ public class ProjectServiceImpl extends BaseServiceImpl staffList = projectStaffService.getStaffsByProjectId(fromDTO.getProjectId()); @@ -408,8 +483,23 @@ public class ProjectServiceImpl extends BaseServiceImpl msgList = new ArrayList<>(); UserMessageFormDTO messageFormDTO = new UserMessageFormDTO(); @@ -477,6 +610,23 @@ public class ProjectServiceImpl extends BaseServiceImpl wxmpMsgList = new ArrayList<>(); + WxSubscribeMessageFormDTO msg = new WxSubscribeMessageFormDTO(); + msg.setCustomerId(projectEntity.getCustomerId()); + msg.setClientType(AppClientConstant.APP_GOV); + msg.setUserId(projectStaffDTO.getStaffId()); + msg.setBehaviorType("项目消息"); + msg.setMessageContent(String.format(UserMessageConstant.PROJECT_RESOLVED_MSG, projectEntity.getTitle())); + msg.setMessageTime(new Date()); + msg.setGridId("*"); + wxmpMsgList.add(msg); + //发送微信订阅消息 sun + logger.info("项目退回,开始推送微信订阅消息"); + Result result = epmetMessageOpenFeignClient.sendWxSubscribeMessage(wxmpMsgList); + if (!result.success()) { + logger.error("项目退回成功,发送微信订阅消息失败" + JSON.toJSONString(result)); + } } @Override @@ -593,6 +743,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); @@ -643,6 +801,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(); @@ -660,6 +836,8 @@ 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("计算首次响应时间失败"); + } + } + + /** + * 项目滞留超期提醒 + * + * @param customerId + * @return void + * @author zhaoqifeng + * @date 2020/10/21 15:21 + */ + @Override + public void sendMessage(String customerId) { + List paramList = parameterService.getParameterByCustomer(customerId); + List defaultList = parameterService.getParameterByCustomer("default"); + //可滞留天数 + int detentionDays = 5; + //计算方式 + String calculation = ParameterKeyConstant.WORK; + //即将超期提醒时间 + int remindTime = 0; + //推送时间 + String pushTime = "08:00"; + if (CollectionUtils.isNotEmpty(paramList)) { + for (CustomerProjectParameterDTO dto : paramList) { + if (ParameterKeyConstant.DETENTION_DAYS.equals(dto.getParameterKey())) { + detentionDays = Integer.parseInt(dto.getParameterValue()); + } else if (ParameterKeyConstant.CALCULATION.equals(dto.getParameterKey())) { + calculation = dto.getParameterValue(); + } else if (ParameterKeyConstant.REMIND_TIME.equals(dto.getParameterKey())) { + remindTime = Integer.parseInt(dto.getParameterValue()); + } else if (ParameterKeyConstant.PUSH_TIME.equals(dto.getParameterKey())) { + pushTime = dto.getParameterValue(); + } + } + + } else { + for (CustomerProjectParameterDTO dto : defaultList) { + if (ParameterKeyConstant.DETENTION_DAYS.equals(dto.getParameterKey())) { + detentionDays = Integer.parseInt(dto.getParameterValue()); + } else if (ParameterKeyConstant.CALCULATION.equals(dto.getParameterKey())) { + calculation = dto.getParameterValue(); + } else if (ParameterKeyConstant.REMIND_TIME.equals(dto.getParameterKey())) { + remindTime = Integer.parseInt(dto.getParameterValue()); + } else if (ParameterKeyConstant.PUSH_TIME.equals(dto.getParameterKey())) { + pushTime = dto.getParameterValue(); + } + } + } + //获取工作人员未处理的节点 + List unHandledList = projectStaffService.getStaffUnHandledList(customerId); + if (CollectionUtils.isNotEmpty(unHandledList)) { + List form = unHandledList.stream().map(item -> { + CostDayFormDTO dto = new CostDayFormDTO(); + dto.setId(item.getId()); + dto.setStaffId(item.getStaffId()); + if (null != item.getUpdatedTime()) { + dto.setStartDate(item.getUpdatedTime()); + } else { + dto.setStartDate(item.getCreatedTime()); + } + dto.setEndDate(new Date()); + return dto; + }).collect(Collectors.toList()); + List costDayList; + if (ParameterKeyConstant.WORK.equals(calculation)) { + //工作日计算 + Result> result = epmetCommonServiceOpenFeignClient.costWorkDays(form); + if (!result.success()) { + throw new RenException(result.getCode(), result.getMsg()); + } + costDayList = result.getData(); + } else { + //日历日计算 + 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); + } + } + } + + /** + * @Description 项目节点耗时数据补齐 + * @param + * @return void + * @author wangc + * @date 2020.10.26 10:54 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void projectProcessCostTimeDataCompensation() { + List 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());*/ + + List handleTimeInterval = new LinkedList<>(); + + List responseTimeInterval = new LinkedList<>(); + totalContainer.forEach(local -> { + if(null != local.getHandledDate()){ + TimestampIntervalFormDTO handle = new TimestampIntervalFormDTO(); + handle.setId(local.getProjectStaffId()); + handle.setLeft(local.getInformedDate()); + handle.setRight(local.getHandledDate()); + handleTimeInterval.add(handle); + } + if(null != local.getFirstDealtDate()){ + TimestampIntervalFormDTO response = new TimestampIntervalFormDTO(); + response.setId(local.getProjectStaffId()); + response.setLeft(local.getInformedDate()); + response.setRight(local.getFirstDealtDate()); + responseTimeInterval.add(response); + } + }); + + + Map batchDelta_T = batchCalculateDelta_T(ProjectConstant.IMPRECISE_CALCULATION, + ProjectConstant.CALCULATION_TYPE_DEFAULT,handleTimeInterval); + Map batchDelta_TResponse = batchCalculateDelta_T(ProjectConstant.IMPRECISE_CALCULATION, + ProjectConstant.CALCULATION_TYPE_DEFAULT,responseTimeInterval); + + + 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)); + if(v.getHandledDate() == v.getFirstDealtDate())v.setFirstReplyPeriod(batchDelta_T.get(k)); + else v.setFirstReplyPeriod(batchDelta_TResponse.get(k)); + } + }); + List> partition = ListUtils.partition(totalContainer, NumConstant.ONE_HUNDRED); + partition.forEach(subList -> {relationDao.batchInsertProjectOrgRelation(subList);}); + } + } + } + + /** + * 项目滞留超期提醒定时任务 + * + * @param dto + * @return void + * @author zhaoqifeng + * @date 2020/10/26 10:53 + */ + @Override + public void sendMessageJob(ProjectDTO dto) { + Result> result = operCrmOpenFeignClient.getAllCustomerList(); + if (!result.success()) { + throw new RenException(result.getCode(), result.getMsg()); + } + if (CollectionUtils.isNotEmpty(result.getData())) { + if(null != dto && StringUtils.isNotBlank(dto.getCustomerId())) { + sendMessage(dto.getCustomerId()); + } else { + for (CustomerDTO customerDTO : result.getData()) { + //获取客户配置,如果存在,则判断客户配置是否在该时间段内,如果不存在,则使用默认配置 + CustomerProjectParameterDTO config = parameterService.getPushTimeConfig(customerDTO.getId()); + if (null != config) { + //客户配置是否在该时间段内 + CustomerProjectParameterDTO pushTime = parameterService.getPushTime(customerDTO.getId()); + if(null != pushTime) { + sendMessage(customerDTO.getId()); + } + } else { + //获取默认配置 + CustomerProjectParameterDTO defaultPushTime = parameterService.getDefaultPushTime(); + if(null != defaultPushTime) { + sendMessage(customerDTO.getId()); + } + } + } + } + } + } + + 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<>(); + //10.29 项目滞留提醒添加推送微信消息 sun + List wxmpMsgList = 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); + + //10.29 项目滞留提醒添加推送微信消息 sun + WxSubscribeMessageFormDTO wxmp = new WxSubscribeMessageFormDTO(); + wxmp.setCustomerId(customerId); + wxmp.setClientType(ProjectConstant.GOV); + wxmp.setUserId(dto.getStaffId()); + wxmp.setBehaviorType("项目滞留提醒"); + wxmp.setMessageContent(msg); + wxmp.setMessageTime(new Date()); + wxmp.setGridId(StrConstant.STAR); + wxmpMsgList.add(wxmp); + }); + messageFeignClient.saveUserMessageList(msgList); + logger.info("项目滞留提醒,开始推送微信订阅消息"); + Result result = epmetMessageOpenFeignClient.sendWxSubscribeMessage(wxmpMsgList); + if (!result.success()) { + logger.error("项目滞留提醒,发送微信订阅消息失败" + JSON.toJSONString(result)); + } + } + + + /** + * @Description 跨级分组 eg -> 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; + int seq = NumConstant.ZERO; + a: + for (int index = NumConstant.ZERO; index < staffResponseTraceUnit.size(); index++) { + if(StringUtils.isNotBlank(staffResponseTraceUnit.get(index).getOperation()) && staffResponseTraceUnit.get(index).getOperation().contains("create")) continue; + if (StringUtils.equals("response", staffResponseTraceUnit.get(index).getOperation())) { + + replaceFirstResponseDate(incompleteBodyUnit,staffResponseTraceUnit.get(index),seq); + seq++; + 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),seq); + seq++; + } + } + } + }); + } + } + } + + } + } + } + + private void replaceFirstResponseDate(List dest, + ProjectOrgRelationWhenResponseResultDTO staffResponseTraceUnit,int seq){ + // 传递过来的dest是已经按照projectId分好组之后再按照staff分组的集合 + // dest key->staff + ProjectOrgPeriodResultDTO target = dest.get(seq); + if(null != target) target.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 e33943f2e4..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,8 +30,10 @@ import com.epmet.dao.ProjectStaffDao; import com.epmet.dto.ProjectStaffDTO; import com.epmet.dto.form.DepartmentStaffListFormDTO; import com.epmet.dto.form.TransferOptionalStaffListFormDTO; + import com.epmet.dto.result.DepartmentResultDTO; import com.epmet.dto.result.DepartmentStaffListResultDTO; +import com.epmet.dto.result.StaffUnHandledDTO; import com.epmet.entity.ProjectStaffEntity; import com.epmet.feign.GovOrgFeignClient; import com.epmet.redis.ProjectStaffRedis; @@ -155,4 +157,48 @@ public class ProjectStaffServiceImpl extends BaseServiceImpl + * @author zhaoqifeng + * @date 2020/10/21 16:54 + */ + @Override + public List getStaffUnHandledList(String customerId) { + return baseDao.getStaffUnHandledList(customerId); + } + + /*** + * @Description 根据项目ID查询项目-人员表的ID + * @param projectId + * @return java.util.List + * @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); + } + + @Override + public List 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..739433fb77 --- /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' , +ADD COLUMN `DEPARTMENT_ID` varchar(64) NULL COMMENT '部门ID' , +ADD COLUMN `GRID_ID` varchar(64) NULL COMMENT '网格ID' , +ADD COLUMN `ORG_ID_PATH` varchar(500) NULL COMMENT '所属机关(11:22:33)', +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/db/migration/V0.0.3__default.sql b/epmet-module/gov-project/gov-project-server/src/main/resources/db/migration/V0.0.3__default.sql new file mode 100644 index 0000000000..d022ebec3a --- /dev/null +++ b/epmet-module/gov-project/gov-project-server/src/main/resources/db/migration/V0.0.3__default.sql @@ -0,0 +1,6 @@ +INSERT INTO customer_project_parameter(`ID`, `CUSTOMER_ID`, `PARAMETER_KEY`, `PARAMETER_NAME`, `PARAMETER_VALUE`, `DESCRIPTION`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1000', 'default', 'detention_days', '可滞留天数', '5', '默5天', '0', 1, '1', '2020-10-26 10:57:41', '1', '2020-10-26 10:57:45'); +INSERT INTO customer_project_parameter(`ID`, `CUSTOMER_ID`, `PARAMETER_KEY`, `PARAMETER_NAME`, `PARAMETER_VALUE`, `DESCRIPTION`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1001', 'default', 'calculation', '计算方式', 'work', '计算方式 工作日work 日历天calendar', '0', 1, '1', '2020-10-26 10:57:41', '1', '2020-10-26 10:57:45'); +INSERT INTO customer_project_parameter(`ID`, `CUSTOMER_ID`, `PARAMETER_KEY`, `PARAMETER_NAME`, `PARAMETER_VALUE`, `DESCRIPTION`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1002', 'default', 'remind_time', '即将超期提醒时间', '0', '默认 当天', '0', 1, '1', '2020-10-26 10:57:41', '1', '2020-10-26 10:57:45'); +INSERT INTO customer_project_parameter(`ID`, `CUSTOMER_ID`, `PARAMETER_KEY`, `PARAMETER_NAME`, `PARAMETER_VALUE`, `DESCRIPTION`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1003', 'default', 'push_time', '推送时间', '08:00', '默认 上午8点', '0', 1, '1', '2020-10-26 10:57:41', '1', '2020-10-26 10:57:45'); +INSERT INTO customer_project_parameter(`ID`, `CUSTOMER_ID`, `PARAMETER_KEY`, `PARAMETER_NAME`, `PARAMETER_VALUE`, `DESCRIPTION`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1004', 'default', 'start_time', '设定核算单位天开始时间', '00:00:00', '默认 00:00:00', '0', 1, '1', '2020-10-26 10:57:41', '1', '2020-10-26 10:57:45'); +INSERT INTO customer_project_parameter(`ID`, `CUSTOMER_ID`, `PARAMETER_KEY`, `PARAMETER_NAME`, `PARAMETER_VALUE`, `DESCRIPTION`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1005', 'default', 'end_time', '设定核算单位天结束时间', '23:59:00', '默认 23:59:00', '0', 1, '1', '2020-10-26 10:57:41', '1', '2020-10-26 10:57:45'); diff --git a/epmet-module/gov-project/gov-project-server/src/main/resources/logback-spring.xml b/epmet-module/gov-project/gov-project-server/src/main/resources/logback-spring.xml index 236abcb4e9..c4e23d9fe9 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/resources/logback-spring.xml +++ b/epmet-module/gov-project/gov-project-server/src/main/resources/logback-spring.xml @@ -134,7 +134,7 @@ - + diff --git a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/CustomerProjectParameterDao.xml b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/CustomerProjectParameterDao.xml index 25a30d23a9..51e132a61c 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/CustomerProjectParameterDao.xml +++ b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/CustomerProjectParameterDao.xml @@ -26,6 +26,49 @@ and CUSTOMER_ID = #{customerId} and PARAMETER_KEY = #{parameterKey} + + + + \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectDao.xml b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectDao.xml index 8979d90f57..baf33ff218 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectDao.xml +++ b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectDao.xml @@ -195,4 +195,15 @@ AND p.ID = #{id} AND ps.IS_HANDLE = 'unhandled' + + + \ 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..e07b0e9f54 --- /dev/null +++ b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectOrgRelationDao.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 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} + ) + + + + + + + + + + + INSERT INTO project_org_relation( + ID, + PROJECT_STAFF_ID, + INFORMED_DATE, + HANDLED_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}, + #{item.handledDate}, + NOW(), + NOW(), + #{item.sourceOperation}, + #{item.operation}, + #{item.totalPeriod}, + #{item.firstDealtDate}, + #{item.firstReplyPeriod}, + 'COMPENSATION_ROBOT', + 'COMPENSATION_ROBOT' + ) + + + + + + DELETE FROM + 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 b2fc15543a..3664a8eeb9 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 @@ -41,7 +41,9 @@ LIMIT 1 + + + + + + + + + + + \ No newline at end of file diff --git a/epmet-module/gov-voice/gov-voice-server/deploy/docker-compose-dev.yml b/epmet-module/gov-voice/gov-voice-server/deploy/docker-compose-dev.yml index b301615811..be773bc448 100644 --- a/epmet-module/gov-voice/gov-voice-server/deploy/docker-compose-dev.yml +++ b/epmet-module/gov-voice/gov-voice-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: gov-voice-server: container_name: gov-voice-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/gov-voice-server:0.3.68 + image: 192.168.1.130:10080/epmet-cloud-dev/gov-voice-server:version_placeholder ports: - "8105:8105" network_mode: host # 使用现有网络 diff --git a/epmet-module/gov-voice/gov-voice-server/deploy/docker-compose-test.yml b/epmet-module/gov-voice/gov-voice-server/deploy/docker-compose-test.yml index 85cace2d57..7ab0900635 100644 --- a/epmet-module/gov-voice/gov-voice-server/deploy/docker-compose-test.yml +++ b/epmet-module/gov-voice/gov-voice-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: gov-voice-server: container_name: gov-voice-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/gov-voice-server:0.3.67 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/gov-voice-server:version_placeholder ports: - "8105:8105" network_mode: host # 使用现有网络 diff --git a/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/service/impl/ArticleServiceImpl.java b/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/service/impl/ArticleServiceImpl.java index 435f35c656..5c8ed40e39 100644 --- a/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/service/impl/ArticleServiceImpl.java +++ b/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/service/impl/ArticleServiceImpl.java @@ -58,6 +58,8 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.jsoup.helper.StringUtil; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -79,6 +81,7 @@ import java.util.stream.Collectors; @Slf4j @Service public class ArticleServiceImpl extends BaseServiceImpl implements ArticleService { + private Logger logger = LogManager.getLogger(ArticleServiceImpl.class); @Autowired private GovOrgOpenFeignClient govOrgOpenFeignClient; @Autowired @@ -970,6 +973,7 @@ public class ArticleServiceImpl extends BaseServiceImpl msgList = new ArrayList<>(); + WxSubscribeMessageFormDTO formDTO = new WxSubscribeMessageFormDTO(); + formDTO.setCustomerId(customerId); + formDTO.setClientType(AppClientConstant.APP_GOV); + formDTO.setUserId(loginUserUtil.getLoginUserId()); + formDTO.setBehaviorType(String.format(ModuleConstant.WXMP_MSG_TITLE, title)); + formDTO.setMessageContent(content); + formDTO.setMessageTime(new Date()); + formDTO.setGridId("*"); + msgList.add(formDTO); + logger.info("发布文章审核,开始推送微信订阅消息"); + return epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); + } @Override public void updateDraftPublishStatus(String draftId, String statusFlag, String titleAuditStatus) { diff --git a/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/utils/ModuleConstant.java b/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/utils/ModuleConstant.java index 6b3fddb443..cd92a28662 100644 --- a/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/utils/ModuleConstant.java +++ b/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/utils/ModuleConstant.java @@ -83,16 +83,20 @@ public interface ModuleConstant { * 文章站内消息标题 */ String MSG_TITLE = "您有一条文章【%s】的消息"; + /** + * 文章微信订阅消息 + */ + String WXMP_MSG_TITLE = "文章【%s】的消息"; /** * 文章未审核通过 消息内容模版 */ - String MSG_AUDIT_CONTENT = "您好,您发布的【%s】文章%s审核未通过,请重新编辑后发布,谢谢。"; + String MSG_AUDIT_CONTENT = "您发布的【%s】文章%s审核未通过,请重新编辑后发布,谢谢。"; /** * 文章发布失败 内部错误导致 * */ - String MSG_ARTICLE_PUBLISH_ERROR = "您好,你发布的【%s】文章由于网络错误未发布成功,请重新发布,谢谢。"; + String MSG_ARTICLE_PUBLISH_ERROR = "您发布的【%s】文章由于网络错误未发布成功,请重新发布,谢谢。"; /** * 草稿Id不存在 diff --git a/epmet-module/oper-access/oper-access-server/deploy/docker-compose-dev.yml b/epmet-module/oper-access/oper-access-server/deploy/docker-compose-dev.yml index c2fe2f3963..94f4886466 100644 --- a/epmet-module/oper-access/oper-access-server/deploy/docker-compose-dev.yml +++ b/epmet-module/oper-access/oper-access-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: oper-access-server: container_name: oper-access-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/oper-access-server:0.3.18 + image: 192.168.1.130:10080/epmet-cloud-dev/oper-access-server:version_placeholder ports: - "8093:8093" network_mode: host # 使用现有网络 diff --git a/epmet-module/oper-access/oper-access-server/deploy/docker-compose-test.yml b/epmet-module/oper-access/oper-access-server/deploy/docker-compose-test.yml index 0ef28f8ed5..286203506d 100644 --- a/epmet-module/oper-access/oper-access-server/deploy/docker-compose-test.yml +++ b/epmet-module/oper-access/oper-access-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: oper-access-server: container_name: oper-access-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/oper-access-server:0.3.15 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/oper-access-server:version_placeholder ports: - "8093:8093" network_mode: host # 使用现有网络 diff --git a/epmet-module/oper-crm/oper-crm-server/deploy/docker-compose-dev.yml b/epmet-module/oper-crm/oper-crm-server/deploy/docker-compose-dev.yml index ae71928e4e..603196b2b6 100644 --- a/epmet-module/oper-crm/oper-crm-server/deploy/docker-compose-dev.yml +++ b/epmet-module/oper-crm/oper-crm-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: oper-crm-server: container_name: oper-crm-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/oper-crm-server:0.3.70 + image: 192.168.1.130:10080/epmet-cloud-dev/oper-crm-server:version_placeholder ports: - "8090:8090" network_mode: host # 使用现有网络 diff --git a/epmet-module/oper-crm/oper-crm-server/deploy/docker-compose-test.yml b/epmet-module/oper-crm/oper-crm-server/deploy/docker-compose-test.yml index f0c305d782..80a237aefb 100644 --- a/epmet-module/oper-crm/oper-crm-server/deploy/docker-compose-test.yml +++ b/epmet-module/oper-crm/oper-crm-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: oper-crm-server: container_name: oper-crm-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/oper-crm-server:0.3.64 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/oper-crm-server:version_placeholder ports: - "8090:8090" network_mode: host # 使用现有网络 diff --git a/epmet-module/oper-customize/oper-customize-server/deploy/docker-compose-dev.yml b/epmet-module/oper-customize/oper-customize-server/deploy/docker-compose-dev.yml index b0df052225..9d936ebb6b 100644 --- a/epmet-module/oper-customize/oper-customize-server/deploy/docker-compose-dev.yml +++ b/epmet-module/oper-customize/oper-customize-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: oper-customize-server: container_name: oper-customize-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/oper-customize-server:0.3.47 + image: 192.168.1.130:10080/epmet-cloud-dev/oper-customize-server:version_placeholder ports: - "8089:8089" network_mode: host # 使用现有网络 diff --git a/epmet-module/oper-customize/oper-customize-server/deploy/docker-compose-test.yml b/epmet-module/oper-customize/oper-customize-server/deploy/docker-compose-test.yml index ff15600fc8..bff06f7016 100644 --- a/epmet-module/oper-customize/oper-customize-server/deploy/docker-compose-test.yml +++ b/epmet-module/oper-customize/oper-customize-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: oper-customize-server: container_name: oper-customize-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/oper-customize-server:0.3.25 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/oper-customize-server:version_placeholder ports: - "8089:8089" network_mode: host # 使用现有网络 diff --git a/epmet-module/resi-group/resi-group-server/deploy/docker-compose-dev.yml b/epmet-module/resi-group/resi-group-server/deploy/docker-compose-dev.yml index 7a0d7418f8..dc0e3a442f 100644 --- a/epmet-module/resi-group/resi-group-server/deploy/docker-compose-dev.yml +++ b/epmet-module/resi-group/resi-group-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: resi-group-server: container_name: resi-group-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/resi-group-server:0.3.66 + image: 192.168.1.130:10080/epmet-cloud-dev/resi-group-server:version_placeholder ports: - "8095:8095" network_mode: host # 使用现有网络 diff --git a/epmet-module/resi-group/resi-group-server/deploy/docker-compose-test.yml b/epmet-module/resi-group/resi-group-server/deploy/docker-compose-test.yml index 73a38f0279..c53fed3810 100644 --- a/epmet-module/resi-group/resi-group-server/deploy/docker-compose-test.yml +++ b/epmet-module/resi-group/resi-group-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: resi-group-server: container_name: resi-group-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/resi-group-server:0.3.66 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/resi-group-server:version_placeholder ports: - "8095:8095" network_mode: host # 使用现有网络 diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/constant/UserMessageConstant.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/constant/UserMessageConstant.java index f9b97bfb9f..d7da80088c 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/constant/UserMessageConstant.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/constant/UserMessageConstant.java @@ -37,12 +37,12 @@ public interface UserMessageConstant { /** * 建组审核驳回时消息模板 * */ - String DISAGREE_CREATING_GROUP_MSG_TEMPLATE = "您好,您申请的%s,已被驳回,原因:%s。"; + String DISAGREE_CREATING_GROUP_MSG_TEMPLATE = "您申请的%s,已被驳回,原因:%s。"; /** * 建组审核同意时消息模板 * */ - String AGREE_CREATING_GROUP_MSG_TEMPLATE = "您好,您申请的%s,已审核通过。"; + String AGREE_CREATING_GROUP_MSG_TEMPLATE = "您申请的%s,已审核通过。"; /** * 审核建组申请消息名称 @@ -62,6 +62,16 @@ public interface UserMessageConstant { /** * 组长审核入组申请时的微信订阅behavior */ - String WX_APPLY_GROUP_BEHAVIOR = "小组消息"; + String WX_APPLY_JOIN_GROUP_BEHAVIOR = "小组消息"; + + /** + * 建组审核的微信订阅behavior + */ + String WX_APPLY_CREATE_GROUP_BEHAVIOR = "建组审核消息"; + + /** + * 申请建组的微信订阅behavior + */ + String WX_CREATE_GROUP_BEHAVIOR = "建组申请消息"; } diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java index dacfd6dbb8..14e71c03bc 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java @@ -21,6 +21,7 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.AppClientConstant; import com.epmet.commons.tools.constant.EpmetRoleKeyConstant; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; @@ -34,6 +35,7 @@ import com.epmet.constant.ReadFlagConstant; import com.epmet.dto.form.*; import com.epmet.dto.result.UserResiInfoResultDTO; import com.epmet.dto.result.UserRoleResultDTO; +import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.modules.constant.UserMessageConstant; import com.epmet.modules.feign.EpmetMessageFeignClient; import com.epmet.modules.feign.EpmetUserFeignClient; @@ -122,6 +124,9 @@ public class ResiGroupServiceImpl extends BaseServiceImpl page(Map params) { IPage page = baseDao.selectPage( @@ -569,6 +574,18 @@ public class ResiGroupServiceImpl extends BaseServiceImpl msgList = new ArrayList<>(); + msgList.add(wxSubscribeMessageFormDTO); + epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); //更新政府端:工作-基层治理-党员认证reddot resiGroupRedis.subtractWorkGrassrootsPartyAuthRedDotValue(resiGroupDTO.getGridId()); return new Result(); @@ -615,6 +632,20 @@ public class ResiGroupServiceImpl extends BaseServiceImpl msgList = new ArrayList<>(); + msgList.add(wxSubscribeMessageFormDTO); + epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); + //更新政府端:工作-基层治理-党员认证reddot resiGroupRedis.subtractWorkGrassrootsPartyAuthRedDotValue(resiGroupDTO.getGridId()); return new Result(); @@ -950,7 +981,9 @@ public class ResiGroupServiceImpl extends BaseServiceImpl 0){ List msgList = new ArrayList<>(); + List subscribeList = new ArrayList<>(); for(String to : staffRoles.getData()){ + //站内信 UserMessageFormDTO msgObj = new UserMessageFormDTO(); msgObj.setApp(ModuleConstant.APP_GOV); msgObj.setCustomerId(customerId); @@ -960,6 +993,19 @@ public class ResiGroupServiceImpl extends BaseServiceImpl NumConstant.ZERO){ + epmetMessageOpenFeignClient.sendWxSubscribeMessage(subscribeList); } Result result = epmetMessageFeignClient.saveUserMessageList(msgList); if(result.success()){ diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/invitation/service/impl/GroupInvitationServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/invitation/service/impl/GroupInvitationServiceImpl.java index bb02b51d0d..606eb75fbe 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/invitation/service/impl/GroupInvitationServiceImpl.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/invitation/service/impl/GroupInvitationServiceImpl.java @@ -28,10 +28,7 @@ import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.constant.ReadFlagConstant; -import com.epmet.dto.form.UserEnterGridFormDTO; -import com.epmet.dto.form.UserInvitationFormDTO; -import com.epmet.dto.form.UserMessageFormDTO; -import com.epmet.dto.form.UserResiInfoFormDTO; +import com.epmet.dto.form.*; import com.epmet.dto.result.UserInfoOnEnterGridResultDTO; import com.epmet.dto.result.UserResiInfoResultDTO; import com.epmet.feign.EpmetMessageOpenFeignClient; @@ -438,6 +435,18 @@ public class GroupInvitationServiceImpl extends BaseServiceImpl msgList = new ArrayList<>(); + msgList.add(wxSubscribeMessageFormDTO); + epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); if (result.success()) { logger.info("通知群主有新成员入群成功"); } else { diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/service/impl/ResiGroupMemberServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/service/impl/ResiGroupMemberServiceImpl.java index db6422eee4..318989299c 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/service/impl/ResiGroupMemberServiceImpl.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/service/impl/ResiGroupMemberServiceImpl.java @@ -271,6 +271,19 @@ public class ResiGroupMemberServiceImpl extends BaseServiceImpl msgList = new ArrayList<>(); + msgList.add(subscribeDTO); + epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); } catch (Exception e) { logger.error("居民申请入群,给组长发送消息通知异常"); e.printStackTrace(); @@ -455,11 +468,13 @@ public class ResiGroupMemberServiceImpl extends BaseServiceImpl msgList = new ArrayList<>(); msgList.add(wxSubscribeMessageFormDTO); epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); @@ -533,7 +548,9 @@ public class ResiGroupMemberServiceImpl extends BaseServiceImpl msgList = new ArrayList<>(); msgList.add(wxSubscribeMessageFormDTO); @@ -625,6 +642,18 @@ public class ResiGroupMemberServiceImpl extends BaseServiceImpl msgList = new ArrayList<>(); + msgList.add(subscribeMessageFormDTO); + epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); result.setMsg(GroupMemberConstant.SLIENT_SUCCESS); return result; } diff --git a/epmet-module/resi-guide/resi-guide-server/deploy/docker-compose-dev.yml b/epmet-module/resi-guide/resi-guide-server/deploy/docker-compose-dev.yml index 902a0e4bb6..a487c1147c 100644 --- a/epmet-module/resi-guide/resi-guide-server/deploy/docker-compose-dev.yml +++ b/epmet-module/resi-guide/resi-guide-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: resi-guide-server: container_name: resi-guide-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/resi-guide-server:0.3.20 + image: 192.168.1.130:10080/epmet-cloud-dev/resi-guide-server:version_placeholder ports: - "8091:8091" network_mode: host # 使用现有网络 diff --git a/epmet-module/resi-guide/resi-guide-server/deploy/docker-compose-prod.yml b/epmet-module/resi-guide/resi-guide-server/deploy/docker-compose-prod.yml index 9cadb53ff2..aa0679b83f 100644 --- a/epmet-module/resi-guide/resi-guide-server/deploy/docker-compose-prod.yml +++ b/epmet-module/resi-guide/resi-guide-server/deploy/docker-compose-prod.yml @@ -2,7 +2,7 @@ version: "3.7" services: resi-guide-server: container_name: resi-guide-server-prod - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-master/resi-guide-server:0.3.20 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-master/resi-guide-server:0.3.21 ports: - "8091:8091" network_mode: host # 使用现有网络 diff --git a/epmet-module/resi-guide/resi-guide-server/deploy/docker-compose-test.yml b/epmet-module/resi-guide/resi-guide-server/deploy/docker-compose-test.yml index c4a3d796f0..c37a42bcfe 100644 --- a/epmet-module/resi-guide/resi-guide-server/deploy/docker-compose-test.yml +++ b/epmet-module/resi-guide/resi-guide-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: resi-guide-server: container_name: resi-guide-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/resi-guide-server:0.3.20 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/resi-guide-server:version_placeholder ports: - "8091:8091" network_mode: host # 使用现有网络 diff --git a/epmet-module/resi-guide/resi-guide-server/pom.xml b/epmet-module/resi-guide/resi-guide-server/pom.xml index 04ba4c1d3e..098b7a0ba5 100644 --- a/epmet-module/resi-guide/resi-guide-server/pom.xml +++ b/epmet-module/resi-guide/resi-guide-server/pom.xml @@ -2,7 +2,7 @@ 4.0.0 - 0.3.20 + 0.3.21 com.epmet resi-guide diff --git a/epmet-module/resi-hall/resi-hall-server/deploy/docker-compose-dev.yml b/epmet-module/resi-hall/resi-hall-server/deploy/docker-compose-dev.yml index b85358a70e..3e87863bb2 100644 --- a/epmet-module/resi-hall/resi-hall-server/deploy/docker-compose-dev.yml +++ b/epmet-module/resi-hall/resi-hall-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: resi-hall-server: container_name: resi-hall-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/resi-hall-server:0.3.22 + image: 192.168.1.130:10080/epmet-cloud-dev/resi-hall-server:version_placeholder ports: - "8100:8100" network_mode: host # 使用现有网络 diff --git a/epmet-module/resi-hall/resi-hall-server/deploy/docker-compose-test.yml b/epmet-module/resi-hall/resi-hall-server/deploy/docker-compose-test.yml index 6d675b03b8..8da80caf78 100644 --- a/epmet-module/resi-hall/resi-hall-server/deploy/docker-compose-test.yml +++ b/epmet-module/resi-hall/resi-hall-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: resi-hall-server: container_name: resi-hall-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/resi-hall-server:0.3.22 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/resi-hall-server:version_placeholder ports: - "8100:8100" network_mode: host # 使用现有网络 diff --git a/epmet-module/resi-home/resi-home-server/deploy/docker-compose-dev.yml b/epmet-module/resi-home/resi-home-server/deploy/docker-compose-dev.yml index e0cdb9b16c..2f8b97a10b 100644 --- a/epmet-module/resi-home/resi-home-server/deploy/docker-compose-dev.yml +++ b/epmet-module/resi-home/resi-home-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: resi-home-server: container_name: resi-home-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/resi-home-server:0.3.16 + image: 192.168.1.130:10080/epmet-cloud-dev/resi-home-server:version_placeholder ports: - "8104:8104" network_mode: host # 使用现有网络 diff --git a/epmet-module/resi-home/resi-home-server/deploy/docker-compose-test.yml b/epmet-module/resi-home/resi-home-server/deploy/docker-compose-test.yml index 754c7d9398..a2da44bf77 100644 --- a/epmet-module/resi-home/resi-home-server/deploy/docker-compose-test.yml +++ b/epmet-module/resi-home/resi-home-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: resi-home-server: container_name: resi-home-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/resi-home-server:0.3.16 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/resi-home-server:version_placeholder ports: - "8104:8104" network_mode: host # 使用现有网络 diff --git a/epmet-module/resi-mine/resi-mine-server/deploy/docker-compose-dev.yml b/epmet-module/resi-mine/resi-mine-server/deploy/docker-compose-dev.yml index 57e2434372..1ef428be1a 100644 --- a/epmet-module/resi-mine/resi-mine-server/deploy/docker-compose-dev.yml +++ b/epmet-module/resi-mine/resi-mine-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: resi-mine-server: container_name: resi-mine-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/resi-mine-server:0.3.38 + image: 192.168.1.130:10080/epmet-cloud-dev/resi-mine-server:version_placeholder ports: - "8094:8094" network_mode: host # 使用现有网络 diff --git a/epmet-module/resi-mine/resi-mine-server/deploy/docker-compose-test.yml b/epmet-module/resi-mine/resi-mine-server/deploy/docker-compose-test.yml index 2fa05668ea..9545a3feb3 100644 --- a/epmet-module/resi-mine/resi-mine-server/deploy/docker-compose-test.yml +++ b/epmet-module/resi-mine/resi-mine-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: resi-mine-server: container_name: resi-mine-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/resi-mine-server:0.3.38 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/resi-mine-server:version_placeholder ports: - "8094:8094" network_mode: host # 使用现有网络 diff --git a/epmet-module/resi-partymember/resi-partymember-server/deploy/docker-compose-dev.yml b/epmet-module/resi-partymember/resi-partymember-server/deploy/docker-compose-dev.yml index 680f45f751..9013f7458b 100644 --- a/epmet-module/resi-partymember/resi-partymember-server/deploy/docker-compose-dev.yml +++ b/epmet-module/resi-partymember/resi-partymember-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: resi-partymember-server: container_name: resi-partymember-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/resi-partymember-server:0.3.56 + image: 192.168.1.130:10080/epmet-cloud-dev/resi-partymember-server:version_placeholder ports: - "8096:8096" network_mode: host # 使用现有网络 diff --git a/epmet-module/resi-partymember/resi-partymember-server/deploy/docker-compose-test.yml b/epmet-module/resi-partymember/resi-partymember-server/deploy/docker-compose-test.yml index 8ca40ddf75..30f7977dae 100644 --- a/epmet-module/resi-partymember/resi-partymember-server/deploy/docker-compose-test.yml +++ b/epmet-module/resi-partymember/resi-partymember-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: resi-partymember-server: container_name: resi-partymember-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/resi-partymember-server:0.3.56 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/resi-partymember-server:version_placeholder ports: - "8096:8096" network_mode: host # 使用现有网络 diff --git a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/constant/PartyMemberMessageConstant.java b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/constant/PartyMemberMessageConstant.java index 1971a1ac13..86223a328c 100644 --- a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/constant/PartyMemberMessageConstant.java +++ b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/constant/PartyMemberMessageConstant.java @@ -19,10 +19,15 @@ public interface PartyMemberMessageConstant { /** * 党员申请审核通过给申请人发送消息:您好,您申请的党员已审核通过,请查看。 */ - String AUDIT_APPROVE_MSG = "您好,您申请的%s党员已审核通过,请查看。"; + String AUDIT_APPROVE_MSG = "您申请的%s党员已审核通过,请查看。"; /** * 党员申请审核驳回给申请人发送消息:您好,您申请的党员,由于不符合条件的原因,已被驳回。 */ - String AUDIT_REJECT_MSG = "您好,您申请的%s党员,由于不符合条件的原因,已被驳回。"; + String AUDIT_REJECT_MSG = "您申请的%s党员,由于不符合条件的原因,已被驳回。"; + + /** + * 党员申请behavior + */ + String WX_PARTY_AUTH_BEHAVIOR = "党员申请消息"; } diff --git a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/impl/PartyMemberConfirmServiceImpl.java b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/impl/PartyMemberConfirmServiceImpl.java index eeddca8fda..5962ea22a2 100644 --- a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/impl/PartyMemberConfirmServiceImpl.java +++ b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/impl/PartyMemberConfirmServiceImpl.java @@ -645,14 +645,17 @@ public class PartyMemberConfirmServiceImpl implements PartyMemberConfirmService String messageContent = String.format(userMsg, gridName); userMessageFormDTO.setMessageContent(messageContent); userMessageFormDTO.setReadFlag(ReadFlagConstant.UN_READ); + userMessageFormDTO.setUserId(formDTO.getUserId()); //发送微信订阅消息 WxSubscribeMessageFormDTO wxSubscribeMessageFormDTO = new WxSubscribeMessageFormDTO(); wxSubscribeMessageFormDTO.setCustomerId(formDTO.getCustomerId()); wxSubscribeMessageFormDTO.setUserId(formDTO.getUserId()); wxSubscribeMessageFormDTO.setClientType(AppClientConstant.APP_RESI); - wxSubscribeMessageFormDTO.setBehaviorType(ResiWarmUserMessageConstant.WX_WARMHEARTED_BEHAVIOR); + wxSubscribeMessageFormDTO.setGridId(formDTO.getGridId()); + wxSubscribeMessageFormDTO.setBehaviorType(PartyMemberMessageConstant.WX_PARTY_AUTH_BEHAVIOR); wxSubscribeMessageFormDTO.setMessageContent(messageContent); + wxSubscribeMessageFormDTO.setMessageTime(new Date()); List msgList = new ArrayList<>(); msgList.add(wxSubscribeMessageFormDTO); epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); @@ -696,9 +699,11 @@ public class PartyMemberConfirmServiceImpl implements PartyMemberConfirmService //4:遍历找出当前网格的所有网格长并给网格长发消息 List msgList = new ArrayList<>(); + List subscribeList = new ArrayList<>(); staffList.forEach(staff->{ roleList.forEach(role->{ if(staff.getUserId().equals(role.getStaffId())){ + //站内信 UserMessageFormDTO msgDTO = new UserMessageFormDTO(); msgDTO.setCustomerId(formDTO.getCustomerId()); msgDTO.setGridId(formDTO.getGridId()); @@ -708,9 +713,22 @@ public class PartyMemberConfirmServiceImpl implements PartyMemberConfirmService msgDTO.setMessageContent(message); msgDTO.setReadFlag(ReadFlagConstant.UN_READ); msgList.add(msgDTO); + //微信订阅 + WxSubscribeMessageFormDTO subscribeDTO = new WxSubscribeMessageFormDTO(); + subscribeDTO.setClientType(AppClientConstant.APP_GOV); + subscribeDTO.setGridId(formDTO.getGridId()); + subscribeDTO.setUserId(staff.getUserId()); + subscribeDTO.setCustomerId(formDTO.getCustomerId()); + subscribeDTO.setBehaviorType(PartyMemberMessageConstant.WX_PARTY_AUTH_BEHAVIOR); + subscribeDTO.setMessageContent(message); + subscribeDTO.setMessageTime(new Date()); + subscribeList.add(subscribeDTO); } }); }); + if (subscribeList.size() > NumConstant.ZERO){ + epmetMessageOpenFeignClient.sendWxSubscribeMessage(subscribeList); + } if (msgList.size() > NumConstant.ZERO) { result = epmetMessageOpenFeignClient.saveUserMessageList(msgList); } diff --git a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/warmhearted/constant/ResiWarmUserMessageConstant.java b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/warmhearted/constant/ResiWarmUserMessageConstant.java index 13e1231a2a..1f7b6d6959 100644 --- a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/warmhearted/constant/ResiWarmUserMessageConstant.java +++ b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/warmhearted/constant/ResiWarmUserMessageConstant.java @@ -19,12 +19,12 @@ public interface ResiWarmUserMessageConstant { /** * 热心居民申请审核通过给申请人发送消息:您好,您申请的第三网格热心居民已审核通过,请查看。 */ - String AUDIT_APPROVE_MSG = "您好,您申请的%s热心居民已审核通过,请查看。"; + String AUDIT_APPROVE_MSG = "您申请的%s热心居民已审核通过,请查看。"; /** * 热心居民申请审核驳回给申请人发送消息:您好,您申请的第三网格热心居民,已被驳回,原因:不符合要求。 */ - String AUDIT_REJECT_MSG = "您好,您申请的%s热心居民,已被驳回,原因:%s"; + String AUDIT_REJECT_MSG = "您申请的%s热心居民,已被驳回,原因:%s"; /** * 热心居民申请-微信订阅behavior diff --git a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/warmhearted/service/impl/ResiWarmheartedApplyServiceImpl.java b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/warmhearted/service/impl/ResiWarmheartedApplyServiceImpl.java index 26beee052c..d1c595282e 100644 --- a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/warmhearted/service/impl/ResiWarmheartedApplyServiceImpl.java +++ b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/warmhearted/service/impl/ResiWarmheartedApplyServiceImpl.java @@ -66,10 +66,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -268,9 +265,11 @@ public class ResiWarmheartedApplyServiceImpl extends BaseServiceImpl roleList = resultList.getData(); //3:遍历找出当前网格的所有网格长并给网格长发消息 List msgList = new ArrayList<>(); + List subscribeList = new ArrayList<>(); staffList.forEach(staff->{ roleList.forEach(role->{ if(staff.getUserId().equals(role.getStaffId())){ + //站内信 UserMessageFormDTO msgDTO = new UserMessageFormDTO(); msgDTO.setCustomerId(formDTO.getCustomerId()); msgDTO.setGridId(formDTO.getGridId()); @@ -280,9 +279,22 @@ public class ResiWarmheartedApplyServiceImpl extends BaseServiceImpl NumConstant.ZERO){ + epmetMessageOpenFeignClient.sendWxSubscribeMessage(subscribeList); + } if (msgList.size() > NumConstant.ZERO) { result = epmetMessageFeignClient.saveUserMessageList(msgList); } @@ -446,9 +458,11 @@ public class ResiWarmheartedApplyServiceImpl extends BaseServiceImpl msgList = new ArrayList<>(); msgList.add(wxSubscribeMessageFormDTO); epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); diff --git a/epmet-module/resi-voice/resi-voice-server/deploy/docker-compose-dev.yml b/epmet-module/resi-voice/resi-voice-server/deploy/docker-compose-dev.yml index b92e25f3c6..99ab9465a8 100644 --- a/epmet-module/resi-voice/resi-voice-server/deploy/docker-compose-dev.yml +++ b/epmet-module/resi-voice/resi-voice-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: resi-voice-server: container_name: resi-voice-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/resi-voice-server:0.3.7 + image: 192.168.1.130:10080/epmet-cloud-dev/resi-voice-server:version_placeholder ports: - "8106:8106" network_mode: host # 使用现有网络 diff --git a/epmet-module/resi-voice/resi-voice-server/deploy/docker-compose-test.yml b/epmet-module/resi-voice/resi-voice-server/deploy/docker-compose-test.yml index d37cc30473..6baa2c7be4 100644 --- a/epmet-module/resi-voice/resi-voice-server/deploy/docker-compose-test.yml +++ b/epmet-module/resi-voice/resi-voice-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: resi-voice-server: container_name: resi-voice-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/resi-voice-server:0.3.7 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/resi-voice-server:version_placeholder ports: - "8106:8106" network_mode: host # 使用现有网络 diff --git a/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-dev.yml b/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-dev.yml index 7593b66a08..4e86ab5e89 100644 --- a/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-dev.yml +++ b/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-openapi-scan: container_name: epmet-openapi-scan-dev - image: 192.168.1.130:10080/epmet-cloud-dev/epmet-openapi-scan:0.3.24 + image: 192.168.1.130:10080/epmet-cloud-dev/epmet-openapi-scan:version_placeholder ports: - "8107:8107" network_mode: host # 不会创建新的网络 diff --git a/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-test.yml b/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-test.yml index 37c53b9557..49ce30a8c1 100644 --- a/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-test.yml +++ b/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-openapi-scan: container_name: epmet-openapi-scan-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-openapi-scan:0.3.24 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-openapi-scan:version_placeholder ports: - "8107:8107" network_mode: host # 不会创建新的网络 diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/OrganizeTreeFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/OrganizeTreeFormDTO.java new file mode 100644 index 0000000000..5f7c6b4e4f --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/OrganizeTreeFormDTO.java @@ -0,0 +1,21 @@ +package com.epmet.dto.form; + +import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Description 外挂-获取当前组织及部门、网格数据,递归查询所有下级数据-接口入参 + * @Auth sun + */ +@Data +public class OrganizeTreeFormDTO implements Serializable { + + private static final long serialVersionUID = -5093758817860808310L; + @NotBlank(message = "组织Id不能为空" , groups = StaffIdGroup.class) + private String agencyId; + + public interface StaffIdGroup extends CustomerClientShowGroup{} +} diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/BasicInfoResultDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/BasicInfoResultDTO.java new file mode 100644 index 0000000000..37d59e0472 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/BasicInfoResultDTO.java @@ -0,0 +1,53 @@ +package com.epmet.dto.result; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @author sun + * @dscription + */ +@NoArgsConstructor +@Data +public class BasicInfoResultDTO implements Serializable { + + private static final long serialVersionUID = 8987281818368677411L; + /** + * 工作人员id,后台userId + */ + private String staffId; + /** + * 头像 + */ + private String staffHeadPhoto; + /** + * 真实姓名 + */ + private String realName; + /** + * 性别0未知,1男2女 + */ + private Integer gender; + /** + * 手机号 + */ + private String mobile; + /** + * 未禁用enable,已禁用disabled + */ + private String enableFlag; + /** + * inactive未激活,active已激活 + */ + private String activeFlag; + /** + * 激活时间 + */ + private String activeTime; + /** + * fulltime专职parttime兼职 + */ + private String workType; +} diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java index 00397c89e1..d8e65132a4 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java @@ -373,4 +373,11 @@ public interface EpmetUserOpenFeignClient { */ @PostMapping("/epmetuser/more/badge/openedorclosed") Result openedOrClosed(@RequestBody OpenedOrClosedFormDTO openedOrClosedFormDTO); + + /** + * 根据staffId查询用户基本信息 + * @author sun + */ + @PostMapping("/epmetuser/customerstaff/getstaffbasicinfo") + Result getStaffBasicInfo(@RequestBody StaffBasicInfoFromDTO fromDTO); } diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java index 6091c24821..55bbfcd18f 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java @@ -245,4 +245,9 @@ public class EpmetUserOpenFeignClientFallback implements EpmetUserOpenFeignClien public Result openedOrClosed(OpenedOrClosedFormDTO openedOrClosedFormDTO) { return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "openedOrClosed", openedOrClosedFormDTO); } + + @Override + public Result getStaffBasicInfo(StaffBasicInfoFromDTO fromDTO) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "getStaffBasicInfo", fromDTO); + } } diff --git a/epmet-user/epmet-user-server/deploy/docker-compose-dev.yml b/epmet-user/epmet-user-server/deploy/docker-compose-dev.yml index 0a8be8c147..50bed534ed 100644 --- a/epmet-user/epmet-user-server/deploy/docker-compose-dev.yml +++ b/epmet-user/epmet-user-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-user-server: container_name: epmet-user-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/epmet-user-server:0.3.124 + image: 192.168.1.130:10080/epmet-cloud-dev/epmet-user-server:version_placeholder ports: - "8087:8087" network_mode: host # 不会创建新的网络 diff --git a/epmet-user/epmet-user-server/deploy/docker-compose-test.yml b/epmet-user/epmet-user-server/deploy/docker-compose-test.yml index eb18d181c1..d1d7ce6667 100644 --- a/epmet-user/epmet-user-server/deploy/docker-compose-test.yml +++ b/epmet-user/epmet-user-server/deploy/docker-compose-test.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-user-server: container_name: epmet-user-server-test - image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-user-server:0.3.118 + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-user-server:version_placeholder ports: - "8087:8087" network_mode: host # 不会创建新的网络 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/CustomerStaffController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/CustomerStaffController.java index 0075470f27..e8ae592334 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/CustomerStaffController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/CustomerStaffController.java @@ -385,7 +385,7 @@ public class CustomerStaffController { * @Date 11:09 2020-08-25 **/ @PostMapping(value = "staffbasicinfo") - public Result staffBasicInfo(@LoginUser TokenDto tokenDTO){ + public Result staffBasicInfo(@LoginUser TokenDto tokenDTO){ return customerStaffService.selectStaffBasicInfo(tokenDTO.getUserId()); } @@ -401,4 +401,13 @@ public class CustomerStaffController { return new Result().ok(customerStaffService.getStaffIdAndPwd(formDTO)); } + /** + * 根据staffId查询用户基本信息 + * @author sun + */ + @PostMapping("getstaffbasicinfo") + public Result getStaffBasicInfo(@RequestBody StaffBasicInfoFromDTO fromDTO){ + return new Result().ok(customerStaffService.getStaffBasicInfo(fromDTO)); + } + } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/CustomerStaffDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/CustomerStaffDao.java index 2fdc573473..457c88e2f6 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/CustomerStaffDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/CustomerStaffDao.java @@ -18,7 +18,6 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; -import com.epmet.commons.tools.utils.Result; import com.epmet.dto.*; import com.epmet.dto.form.*; import com.epmet.dto.result.*; @@ -190,5 +189,12 @@ public interface CustomerStaffDao extends BaseDao { * @Author zhangyong * @Date 10:07 2020-08-26 **/ - StaffBasicInfoResultDTO selectStaffBasicInfo(@Param("userId") String userId); + BasicInfoResultDTO selectStaffBasicInfo(@Param("userId") String userId); + + /** + * 根据staffId查询用户基本信息 + * @author sun + * @return + */ + BasicInfoResultDTO getStaffBasicInfo(StaffBasicInfoFromDTO fromDTO); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/CustomerStaffService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/CustomerStaffService.java index 996848c4ea..fe3c88e8fb 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/CustomerStaffService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/CustomerStaffService.java @@ -305,7 +305,7 @@ public interface CustomerStaffService extends BaseService { * @Author zhangyong * @Date 11:10 2020-08-25 **/ - Result selectStaffBasicInfo(String userId); + Result selectStaffBasicInfo(String userId); /** * @param formDTO @@ -315,4 +315,10 @@ public interface CustomerStaffService extends BaseService { **/ GovWebOperLoginResultDTO getStaffIdAndPwd(GovWebOperLoginFormDTO formDTO); + /** + * 根据staffId查询用户基本信息 + * @author sun + * @return + */ + BasicInfoResultDTO getStaffBasicInfo(StaffBasicInfoFromDTO fromDTO); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/CustomerStaffServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/CustomerStaffServiceImpl.java index ec85e7b960..17f0ae9f5e 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/CustomerStaffServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/CustomerStaffServiceImpl.java @@ -650,9 +650,9 @@ public class CustomerStaffServiceImpl extends BaseServiceImpl selectStaffBasicInfo(String userId) { - StaffBasicInfoResultDTO resultDTO = baseDao.selectStaffBasicInfo(userId); - return new Result().ok(resultDTO); + public Result selectStaffBasicInfo(String userId) { + BasicInfoResultDTO resultDTO = baseDao.selectStaffBasicInfo(userId); + return new Result().ok(resultDTO); } /** @@ -667,4 +667,14 @@ public class CustomerStaffServiceImpl extends BaseServiceImpl + @@ -257,6 +258,7 @@ staff.REAL_NAME AS nickname, '' AS PROFILE, staff.REAL_NAME AS realName, + staff.MOBILE, role.ROLE_KEY, role.ROLE_NAME, vis.GRID_ID @@ -311,7 +313,7 @@ LIMIT 1 - SELECT cs.CUSTOMER_ID customerId, cs.USER_ID id, @@ -334,4 +336,23 @@ cs.DEL_FLAG = '0' AND cs.USER_ID = #{userId} + +