Commit a57543c1 by “zcwang”

Merge remote-tracking branch 'origin/feature-changeFlow-221110' into feature-changeFlow-221110

parents 7863360b f6bd68d4
......@@ -389,6 +389,23 @@
<artifactId>yanxuan-qc-parent</artifactId>
<version>2.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.netease.mail.yanxuan</groupId>
<artifactId>dschedule-boot-starter</artifactId>
<version>1.0.3-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.netease.mailsaas</groupId>
<artifactId>saas-kit-java-bundle</artifactId>
<version>0.1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.18.1</version>
</dependency>
</dependencies>
<repositories>
......
......@@ -6,13 +6,13 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import tk.mybatis.spring.annotation.MapperScan;
/**
* 项目启动类
*/
@ComponentScan(basePackages = "com.netease.mail.yanxuan.change")
@ComponentScan(basePackages = "com.netease.mail.yanxuan.qc")
@MapperScan("com.netease.mail.yanxuan.change.dal.mapper")
@EnableApolloConfig
@EnableMissaClients(basePackages = "com.netease.mail.yanxuan.change")
......
package com.netease.mail.yanxuan.change.integration.email.conig;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
import com.netease.mail.yanxuan.change.integration.email.enums.EmailType;
import com.netease.mail.yanxuan.change.integration.email.exception.RpcException;
import com.netease.mail.yanxuan.change.integration.email.exception.RpcStatusException;
import com.netease.mail.yanxuan.change.integration.email.exception.RpcTimeoutException;
import com.netease.mail.yanxuan.change.integration.email.util.EncodeUtil;
import com.netease.mail.yanxuan.change.integration.email.util.HttpClientUtil;
import org.aspectj.weaver.Checker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* rpc 请求封装,在 HttpClientUtil 基础上加入了返回值处理和日志
*
* @author lwtang
* @date 2019-02-19
*/
@Component
public class RpcTemplate {
private Logger logger = LoggerFactory.getLogger(RpcTemplate.class);
@Value("${act.rpc.get.retry:1}")
private int rpcGetRetry;
@Value("${act.rpc.post.retry:0}")
private int rpcPostRetry;
public RpcTemplate() {
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
}
private String convertParam(Object param) {
if (param instanceof String) {
return (String) param;
}
String reqParam = "";
if (param instanceof Map) {
reqParam = EncodeUtil.encodeMap((Map) param);
} else if (param != null) {
reqParam = JSON.toJSONString(param);
}
return reqParam;
}
private <T> T execute(String url, Object params, CallHandler<T> handler,
CallTemplate callTemplate, int retryTime, Method method) {
int tryTimes = 0;
RpcException rpcException = null;
String respBody = null;
int statusCode = 200;
while (tryTimes <= retryTime) {
long startTime = System.currentTimeMillis();
try {
respBody = callTemplate.executeCall();
if (StringUtils.isEmpty(respBody)) {
throw new RpcException("response empty");
}
T t = handler.handle(respBody);
return t;
} catch (RpcTimeoutException e) {
rpcException = e;
} catch (RpcStatusException e) {
rpcException = e;
statusCode = e.getCode();
} catch (RpcException e) {
rpcException = e;
} catch (Exception e) {
rpcException = new RpcException(e);
} finally {
if (logger.isDebugEnabled()) {
long costTime = System.currentTimeMillis() - startTime;
String reqParam = convertParam(params);
logger.debug(
"process request, url={}, method={}, params={}, statusCode = {}, response={}, cost={}ms",
url, method.name(), reqParam, statusCode, respBody, costTime);
}
}
tryTimes++;
}
logger.error("request error, url={}, params={}, statusCode = {}, respBody={}", url,
convertParam(params), statusCode, respBody, rpcException);
if (rpcException == null) {
rpcException = new RpcException("服务异常");
}
throw rpcException;
}
/**
* Get 请求
*
* @param url
* @param params
* @param header
* @param timeout
* -1 取默认的超时时间
* @param handler
* @param <T>
* @return
*/
public <T> T get(String url, Map<String, Object> params, Map<String, String> header,
int timeout, CallHandler<T> handler, Integer retryTimes) {
CallTemplate template = () -> HttpClientUtil.get(url, params, header, timeout);
return this.execute(url, params, handler, template, retryTimes, Method.GET);
}
public <T> T get(String url, Map<String, Object> params, CallHandler<T> handler) {
return get(url, params, null, -1, handler, rpcGetRetry);
}
/**
* Post请求(url encoded)
*
* @param url
* @param params
* @param timeout
* @param handler
* @param <T>
* @return
*/
public <T> T post(String url, Map<String, Object> params, int timeout, CallHandler<T> handler,
Integer retryTime) {
CallTemplate template = () -> HttpClientUtil.post(url, params, timeout);
return this.execute(url, params, handler, template, retryTime, Method.POST);
}
/**
* Post请求(url encoded)
*
* @param url
* @param params
* @param timeout
* @param handler
* @param <T>
* @return
*/
public <T> T post(String url, Map<String, Object> params, int timeout, CallHandler<T> handler) {
CallTemplate template = () -> HttpClientUtil.post(url, params, timeout);
return this.execute(url, params, handler, template, rpcPostRetry, Method.POST);
}
/**
* Post Json请求
*
* @param url
* @param params
* @param timeout
* @param handler
* @param <T>
* @return
*/
public <T> T postJson(String url, String params, int timeout, CallHandler<T> handler,
Integer retryTime) {
CallTemplate template = () -> HttpClientUtil.postJson(url, params, timeout);
return this.execute(url, params, handler, template, retryTime, Method.POST);
}
/**
* Post Json请求
*
* @param url
* @param params
* @param timeout
* @param handler
* @param <T>
* @return
*/
public <T> T postJson(String url, String params, int timeout, CallHandler<T> handler) {
CallTemplate template = () -> HttpClientUtil.postJson(url, params, timeout);
return this.execute(url, params, handler, template, rpcPostRetry, Method.POST);
}
enum RpcStatus {
/**
* 成功
*/
SUCCESS(1),
/**
* 告警(请求成功,但非理想值)
*/
WARNING(2),
/**
* 异常
*/
EXCEPTION(3),
/**
* 超时
*/
TIMEOUT(4);
private int value;
RpcStatus(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
enum Method {
/**
* Get请求
*/
GET,
/**
* Post表单请求
*/
POST,
}
/**
* 模板调用
*/
@FunctionalInterface
public interface CallTemplate {
/**
* 模板调用类
*/
String executeCall();
}
/**
* 报文解析
*/
@FunctionalInterface
public interface CallHandler<T> {
/**
* 报文解析
*
* @param resp
* response body
*/
T handle(String resp) throws IOException;
/**
* 校验数据体
*
* @param t
* @return
*/
default boolean check(T t) {
return true;
}
}
}
package com.netease.mail.yanxuan.change.integration.email.conig;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import com.netease.mail.yanxuan.change.integration.email.email.JumpLinkModel;
import com.netease.mail.yanxuan.change.integration.email.email.ProblemConfigureModel;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.ctrip.framework.apollo.spring.annotation.EnableAutoUpdateApolloConfig;
import com.ctrip.framework.apollo.spring.annotation.ValueMapping;
import lombok.Data;
import org.springframework.util.CollectionUtils;
/**
* 第三方平台通用apollo配置
*/
@Data
@Component
@EnableAutoUpdateApolloConfig("3rd.base")
public class ThirdCommonApolloConfig {
private static final String DEFAULT = "default";
/**
* 异常超级管理员(各个接入的服务业务架构统一角色id)
*/
@Value("${abnormalAdminRoleId:7956010101}")
private Long abnormalAdminRoleId;
/**
* 各工作台待办跳转链接
*/
@ValueMapping("${jumpLink:[]}")
private List<JumpLinkModel> jumpLinkMap;
/**
* 各工作台邮件
*/
@ValueMapping("${emailFlowUrl:[]}")
private List<JumpLinkModel> emailFlowUrl;
/**
* 根据产品号获取跳转链接
*
* @param productCode
* @return
*/
public Optional<JumpLinkModel> getJumpLinkByProductCode(String productCode) {
List<JumpLinkModel> list = jumpLinkMap.stream().filter(x -> productCode.equals(x.getProductCode()))
.collect(Collectors.toList());
if (!CollectionUtils.isEmpty(list)) {
return Optional.of(list.get(0));
} else {
list = jumpLinkMap.stream().filter(x -> DEFAULT.equals(x.getProductCode())).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(list)) {
return Optional.of(list.get(0));
}
}
return Optional.of(jumpLinkMap.get(0));
}
@ValueMapping("${warehouseConfigureModel:{}}")
private ProblemConfigureModel warehouseConfigureModel;
@ValueMapping("${carrierConfigureModel:{}}")
private ProblemConfigureModel carrierConfigureModel;
}
package com.netease.mail.yanxuan.change.integration.email.dto;
import lombok.Data;
@Data
public class DeptIdLevelLeaderDTO {
private Integer level;
private Boolean locked;
private Integer orgPosId;
private String orgPosName;
private Integer parentOrgPosId;
private Integer postType;
private Integer rootOrgPosId;
private Integer staffStatus;
private String uid;
private Long userId;
private String userName;
private Integer userType;
}
package com.netease.mail.yanxuan.change.integration.email.dto;
import java.io.Serializable;
public class OrgPosDTO implements Serializable {
private static final long serialVersionUID = 4406420123437327405L;
private int level;
private long orgPosId;
private String orgPosName;
private long parentOrgPosId;
private Integer posStructType;
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public long getOrgPosId() {
return orgPosId;
}
public void setOrgPosId(long orgPosId) {
this.orgPosId = orgPosId;
}
public String getOrgPosName() {
return orgPosName;
}
public void setOrgPosName(String orgPosName) {
this.orgPosName = orgPosName;
}
public long getParentOrgPosId() {
return parentOrgPosId;
}
public void setParentOrgPosId(long parentOrgPosId) {
this.parentOrgPosId = parentOrgPosId;
}
public int getPosStructType() {
return posStructType;
}
public void setPosStructType(int posStructType) {
this.posStructType = posStructType;
}
}
package com.netease.mail.yanxuan.change.integration.email.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RoleBaseDTO {
/**
* 角色唯一id
*/
private Long roleId;
/**
* 角色名称
*/
private String name;
private String remark;
private Long updateTime;
/**
* 是否被锁定
*/
private Boolean locked;
/**
* 创建id
*/
private Long creatorId;
private Integer type;
private Long expireTime;
}
package com.netease.mail.yanxuan.change.integration.email.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ThirdOrgPosDTO {
private String deptId;
private Integer level;
private Integer orgPosId;
private String orgPosName;
private Integer parentOrgPosId;
private Integer posStructType;
private Integer rootOrgPosId;
}
package com.netease.mail.yanxuan.change.integration.email.dto;
import lombok.Data;
@Data
public class UserInfoDTO {
private Long createTime;
private Integer deptIdLevel1;
private Integer deptIdLevel2;
private Integer deptIdLevel3;
private Integer deptIdLevel4;
/**
* 一级部门
*/
private String deptLevel1;
/**
* 二级部门
*/
private String deptLevel2;
/**
* 三级部门
*/
private String deptLevel3;
/**
* 四级部门
*/
private String deptLevel4;
private String extEmail;
private Long firstLoginTime;
private Long lastLoginTime;
private Boolean locked;
private String name;
private Integer orgPosId;
private String srcCode;
/**
* 用户的身份信息,0 正式,1 试用,2 外包,3 派遣,4 实习-签三方,5 实习-未签三方,6 离职
*/
private Integer staffStatus;
private String uid;
private Long userId;
private Integer userType;
}
package com.netease.mail.yanxuan.change.integration.email.dto;
import java.io.Serializable;
/**
* @author hzfujieqi
*/
public class UserOrgMetaDTO implements Serializable {
private static final long serialVersionUID = -2381352783777881742L;
//用户职位ID
private long orgPosId;
//用户id
private long userId;
//用户的上一级职位id
private long parentOrgPosId;
//用户的邮箱
private String uid;
//用户的真名
private String userName;
//用户的职位级别
private int level;
//职位名称
private String orgPosName;
//锁定状态
private Boolean locked;
//职位类型
private int posType;
//业务方附加信息
private String extInfo;
public long getOrgPosId() {
return orgPosId;
}
public void setOrgPosId(long orgPosId) {
this.orgPosId = orgPosId;
}
public long getUserId() {
return userId;
}
public void setUserId(long userId) {
this.userId = userId;
}
public long getParentOrgPosId() {
return parentOrgPosId;
}
public void setParentOrgPosId(long parentOrgPosId) {
this.parentOrgPosId = parentOrgPosId;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public String getOrgPosName() {
return orgPosName;
}
public void setOrgPosName(String orgPosName) {
this.orgPosName = orgPosName;
}
public Boolean getLocked() {
return locked;
}
public void setLocked(Boolean locked) {
this.locked = locked;
}
public int getPosType() {
return posType;
}
public void setPosType(int posType) {
this.posType = posType;
}
public String getExtInfo() {
return extInfo;
}
public void setExtInfo(String extInfo) {
this.extInfo = extInfo;
}
@Override
public String toString() {
return "UserOrgMetaDTO{" + "orgPosId=" + orgPosId + ", userId=" + userId + ", parentOrgPosId=" + parentOrgPosId
+ ", uid='" + uid + '\'' + ", userName='" + userName + '\'' + ", level=" + level + ", orgPosName='"
+ orgPosName + '\'' + ", locked=" + locked + ", posType=" + posType + ", extInfo='" + extInfo + '\'' + '}';
}
}
package com.netease.mail.yanxuan.change.integration.email.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserProductRoleStaticsInfosDTO {
private String uid;
private String name;
private Boolean locked;
private Boolean isVirtual;
/**
* 组织身份权限
*/
private List<RoleBaseDTO> groupIdentityProductRoleInfos;
/**
* 特殊权限
*/
private List<RoleBaseDTO> userProductRoleInfoVos;
}
package com.netease.mail.yanxuan.change.integration.email.dto;
import java.util.List;
public class UserUniteOrgMetaDTO extends UserOrgMetaDTO {
private static final long serialVersionUID = -1682465589038072525L;
/**
* 关联类型 type NORMAL(0, "普通职员"), DERECT(1, "指导员"), MANAGER(2, "负责人");
*/
private int type;
/**
* 员工职责
*/
private String duty;
/**
* 员工状态
*/
private int staffStatus;
/**
* 员工工号
*/
private String employeeNum;
/**
* 员工在职信息类型,OAWorkInfoEnum(0-不在OA,1-在严选事业部,2-在外部门)
*/
private int workInfoType;
/**
* 在职状态,EmployeeStateEnum(0-试用,1-正式,5-离职)
*/
private int workState;
/**
* 0-未收藏,1-已收藏
*/
private int focusStatus;
/**
* 所在的其他职位列表,不包含当前职位
*/
private List<OrgPosDTO> multiOrgPoss;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getDuty() {
return duty;
}
public void setDuty(String duty) {
this.duty = duty;
}
public int getStaffStatus() {
return staffStatus;
}
public void setStaffStatus(int staffStatus) {
this.staffStatus = staffStatus;
}
public String getEmployeeNum() {
return employeeNum;
}
public void setEmployeeNum(String employeeNum) {
this.employeeNum = employeeNum;
}
public int getWorkInfoType() {
return workInfoType;
}
public void setWorkInfoType(int workInfoType) {
this.workInfoType = workInfoType;
}
public int getWorkState() {
return workState;
}
public void setWorkState(int workState) {
this.workState = workState;
}
public int getFocusStatus() {
return focusStatus;
}
public void setFocusStatus(int focusStatus) {
this.focusStatus = focusStatus;
}
public List<OrgPosDTO> getMultiOrgPoss() {
return multiOrgPoss;
}
public void setMultiOrgPoss(List<OrgPosDTO> multiOrgPoss) {
this.multiOrgPoss = multiOrgPoss;
}
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class AbnormalBathEventEhcEmailModel {
private String creator;
private String abnormalName;
private String taskFlowId;
private String deliverUserEmail;
private String deliverUserName;
private String cancelUserEmail;
private String cancelUserName;
private String url;
private String discoverDescription;
private String discoverTime;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class AbnormalEhcEmailModel {
/**
* 异常创建人
*/
private String createUid;
/**
* 异常问题名称
*/
private String abnormalName;
/**
* 工单id
*/
private String flowId;
/**
* 异常问题负责人
*/
private String abnormalPrincipalUid;
/**
* 异常问题负责人
*/
private String abnormalPrincipalUserName;
/**
* 操作人邮箱
*/
private String operatorUid;
/**
* 操作人姓名
*/
private String operatorUserName;
/**
* 审批人邮箱
*/
private String approverUid;
/**
* 审批人姓名
*/
private String approverUserName;
/**
* 工单链接
*/
private String flowUrl;
/**
* 发现描述
*/
private String discoverDescription;
/**
* 发现时间
*/
private String discoverTime;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class AbnormalPunishFlowEhcEmailModel {
private String creator;
private String abnormalName;
private String taskFlowId;
private String execUserEmail;
private String execUserName;
private String cancelUserEmail;
private String cancelUserName;
private String deliverUserEmail;
private String deliverUserName;
private String approveUserEmail;
private String approveUserName;
private String url;
private String discoverDescription;
private String discoverTime;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class AbnormalTaskFlowEhcEmailModel {
private String creator;
private String abnormalName;
private String taskFlowId;
private String taskTypeName;
private String execUserEmail;
private String execUserName;
private String cancelUserEmail;
private String cancelUserName;
private String execUser;
private String execName;
private String approveUserEmail;
private String approveUserName;
private String url;
private Integer execUserType;
private String discoverDescription;
private String discoverTime;
private String taskDescription;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import com.netease.mail.yanxuan.change.integration.email.dto.UserProductRoleStaticsInfosDTO;
import lombok.Data;
@Data
public class AllUserProductRoleInfosResponseResult {
private Integer code;
private String errorCode;
private String errorMsg;
private SearchResult<UserProductRoleStaticsInfosDTO> data;
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.integration.email.email;
import org.assertj.core.util.Lists;
import lombok.SneakyThrows;
import org.springframework.beans.BeanUtils;
import java.util.ArrayList;
import java.util.List;
public class BaseConvertor {
@SneakyThrows
public static <T> T convert(Object object, final Class<T> clazz) {
if (object == null) {
return null;
}
T t = clazz.newInstance();
BeanUtils.copyProperties(object, t);
return t;
}
@SneakyThrows
public static void copyProperties(Object source, Object target) {
BeanUtils.copyProperties(source, target);
}
@SneakyThrows
public static <T> List<T> convert(List<?> objects, final Class<T> clazz) {
if (org.apache.commons.collections.CollectionUtils.isEmpty(objects)) {
return new ArrayList<>();
}
List<T> retList = Lists.newArrayList();
objects.forEach(object -> {
try {
T t = clazz.newInstance();
BeanUtils.copyProperties(object, t);
retList.add(t);
} catch (Exception ex) {
try {
throw ex;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
});
return retList;
}
}
package com.netease.mail.yanxuan.change.integration.email.email;
/**
* 常量定义
*
* @author lwtang
* @date 2018-10-16
*/
public class Constants {
public static final String EHC_PRODUCT_CODE = "ehc";
public static final Integer ONE_HUNDRED = 100;
public static final Integer ONE_THOUSAND = 1000;
public static final String SQE_NAME = "sqe_name:%s";
public static final Integer MAX_QUERY_SIZE = 200;
public static final String REQUEST_HEADER_PRODUCT_CODE = "product-code";
/**
* GlobalId 自增redis值
*/
public static final String ABNORMAL_FLOW_GLOBAL_ID = "abnormalFlowGlobalId";
public static final String TASK_FLOW_GLOBAL_ID = "taskFlowGlobalId";
/**
* GlobalId前缀
*/
public static final String ABNORMAL_FLOW_GLOBAL_NAME = "QC-ABNORMAL-FLOW-";
/**
* 所有异常工单缓存key
*/
public static final String ALL_ABNORMAL_FLOW_KEY = "all_abnormal_flow";
/**
* 新增工单key
*/
public static final String ADD_NEW_FLOW_KEY = "add_new_flow_%s";
/**
*
*/
public static final String TITLE_1 = "您好,系统内临期、延期的异常、任务处理工单汇总如下,请及时处理!";
/**
*
*/
public static final String TITLE_2 = "您好,您的小组成员临期或过期的异常问题处理工单如下,请及时处理!";
/**
*
*/
public static final String TITLE_3 = "您好,系统内临期、延期的异常、任务处理工单汇总如下,无需您处理,请知悉!";
/**
* 舆情配置附加信息 前N个周期的数据均超过阈值
*/
public static final String ABNORMAL_RULE_EXCEEDING_CYCLE_NUM = "前%s个周期的数据均超过阈值";
/**
* 舆情配置附加信息 前N个周期的数据对比呈现持续上升趋势
*/
public static final String ABNORMAL_RULE_RISING_CYCLE_NUM = "前%s个周期的数据对比呈现持续上升趋势";
/**
* 舆情配置附加信息 且
*/
public static final String ABNORMAL_RULE_AND = "且";
/**
* 舆情配置附加信息 或
*/
public static final String ABNORMAL_RULE_OR = "或";
/**
* 通用配置入口id 谛听标签入库
*/
public static final String COMMON_MAX_ID = "maxId";
/**
* 通用配置入口id 普通标签入库
*/
public static final String COMMON_ID = "maxId";
/**
* 正常工单缓存key
*/
public static final String FLOW_CACHE_KEY = "flow_cache_key";
/**
* 过期工单缓存key
*/
public static final String OVERDUE_FLOW_CACHE_KEY = "overdue_flow_cache_key";
/**
* helios cacheName
*/
public static final String EHC_CACHE_LIST = "EHC_CACHE_LIST";
public static final String EHC_CACHE_STRING = "EHC_CACHE_STRING";
/**
* 正常工单缓存key
*/
public static final String EHC_FLOW_CACHE_KEY = "ehc_flow_cache_key";
/**
* 过期工单缓存key
*/
public static final String EHC_OVERDUE_FLOW_CACHE_KEY = "ehc_overdue_flow_cache_key";
public static final String FLOW_ASSIGNED_PROCESSOR_UID = "flow_assigned_processor_uid_";
public static final String FLOW_APPROVE_USER = "flow_approve_user_";
public static final String AUTO_SUBMIT_FLOW = "auto_submit_flow_";
public static final String APPROVER_USER = "approver_user_";
/**
* 舆情异常创建 退货
*/
public static final String RETURN = "退货";
/**
* 舆情异常创建 差评
*/
public static final String BAD_REVIEW = "差评";
/**
* redis 商品前缀 itemId 退/换货 时间类型 二级问题
*/
public static final String RECEIVE_GOODS = "goods_%s_%s_%s_%s";
/**
* redis 供应商前缀 supplierId 退/换货 时间类型 二级问题
*/
public static final String RECEIVE_SUPPLIER = "goods_%s_%s_%s_%s";
/**
* 异常创建信息 商品
*/
public static final String ABNORMAL_CREATE_FIRST_GOOD = "%s-%s在质量%s排行榜发现商品:%s+%s存在质量问题。";
public static final String ABNORMAL_CREATE_SECOND_GOOD = "该商品总计%s次数%s pcs,销量%s pcs,质量%s率为%s%%。";
public static final String ABNORMAL_CREATE_THIRD_GOOD = "其中当前质量问题:%s,有质量%s%s pcs,该问题质量%s率为%s%%。";
public static final String ABNORMAL_CREATE_FOURTH_GOOD = "该商品历史累计%s率为%s%%。";
/**
* 异常创建信息 userName
*/
public static final String ABNORMAL_CREATE_USER_NAME = "品控工作台";
public static final String ABNORMAL_CREATE_USER_EMAIL = "yanxuan@service.netease.com";
public static final String ABNORMAL_CREATE_PRODUCT_CODE = "ecr";
public static final String ABNORMAL_CREATE_PROBLEM_GOODS = "%s%s,质量问题:%s";
public static final String ABNORMAL_CREATE_PROBLEM_SUPPLIER = "%s%s,质量问题:%s";
/**
* 异常创建信息 供应商
*/
public static final String ABNORMAL_CREATE_FIRST_SUPPLIER = "%s-%s在质量%s排行榜发现商品:%s+%s存在质量问题。";
public static final String ABNORMAL_CREATE_SECOND_SUPPLIER = "该供应商总计%s次数%s pcs,销量%s pcs,质量%s率为%s%%。";
public static final String ABNORMAL_CREATE_THIRD_SUPPLIER = "其中当前质量问题:%s,有质量%s%s pcs,该问题质量%s率为%s%%。";
public static final String ABNORMAL_CREATE_FOURTH_SUPPLIER = "该供应商历史累计%s率为%s%%。";
/**
* 异常创建信息 数据更新异常
*/
public static final String ABNORMAL_CREATE_DATA_UPDATE_NOT = "数仓数据%s未更新。";
public static final String ABNORMAL_CREATE_DATA = "品控ECR舆情监控异常创建,";
/**
* 周
*/
public static final String ABNORMAL_CREATE_WEEKS = "周";
/**
* 月
*/
public static final String ABNORMAL_CREATE_MONTH = "月";
/**
* 节点错误
*/
public static final String FLOWX_NODE_ERROR = "%s节点无法保存或提交";
public static final String SUBMIT_OPERATION = "提交工单";
public static final String AUTO_SUBMIT_OPERATION = "系统自动提交工单";
public static final String SYSTEM_AUTO_SUBMIT_OPERATION = "系统自动提交工单";
public static final String SYSTEM_USERNAME = "系统自动提交";
/**
* 批量事件任务工单TopoID
*/
public static final String BATHTOPOID = "ehc_batch_event_task_flow";
/**
* 批量任务人员类型
*/
public static final String EXECUTORTYPE= "严选人员";
/**
* hash map 初始化大小
*/
public static final Integer INIT_HASH_MAP_SIZE = 10;
public static final String SUPPLIER_PREFIX = "YX";
/**
* 解决措施工单过期缓存key
*/
public static final String EHC_TASK_FLOW_OVERDUE_CACHE_KEY = "ehc_task_flow_overdue_cache_key";
/**
* 解决措施工单正常缓存key
*/
public static final String EHC_TASK_FLOW_CACHE_KEY = "ehc_task_flow_cache_key";
/**
* 供应商惩罚工单过期key
*/
public static final String EHC_PUNISH_FLOW_OVERDUE_CACHE_KEY = "ehc_punish_flow_overdue_cache_key";
/**
* 供应商惩罚工单正常key
*/
public static final String EHC_PUNISH_FLOW_CACHE_KEY = "ehc_punish_flow_cache_key";
/**
* 批量事件工单过期key
*/
public static final String EHC_EVENT_FLOW_OVERDUE_CACHE_KEY = "ehc_event_flow_overdue_cache_key";
/**
* 批量事件工单正常key
*/
public static final String EHC_EVENT_FLOW_CACHE_KEY = "ehc_event_flow_cache_key";
/**
* 对比参数默认值
*/
public static final Integer ALL_VALUE = -1;
// 工单业务数据操作key
public static final String FLOW_OPERATION_KEY = "operation";
public static final String YANXUAN_NOS_PREFIX_URL = "yanxuan.nosdn.127.net";
/**
* 默认一页数据量
*/
public static final Integer DEFAULT_PAGE_SIZE = 10;
/**
* 默认页码
*/
public static final Integer DEFAULT_PAGE_NUM = 1;
/**
* 异常问题名称最大长度
*/
public static final int ABNORMAL_NAME_MAX_LENGTH = 500;
/**
* 异常问题描述最大长度
*/
public static final int ABNORMAL_DISCOVER_DESC_MAX_LENGTH = 800;
/**
* 审核依据最大长度
*/
public static final int ABNORMAL_AUDIT_BASIS_MAX_LENGTH = 50;
/**
* 审核内容最大长度
*/
public static final int ABNORMAL_AUDIT_CONTENT_MAX_LENGTH = 500;
/**
* 标签最大长度
*/
public static final int LABEL_MAX_LENGTH = 2000;
public static final String ABNORMAL_PROBLEM_NAME_WAREHOUSE = "%s仓库涉及%s单延迟未发货";
public static final String ABNORMAL_PROBLEM_DESCRIPTION_WAREHOUSE = "%s仓库涉及%s单延迟未发货";
public static final String ABNORMAL_PROBLEM_NAME_CARRIER = "%sB端运输%s件异常商品";
public static final String ABNORMAL_PROBLEM_DESCRIPTION_CARRIER = "%s从%s到%s的B端干线运输环节,产生%s件异常商品,仓库以物流原因操作转次";
public static final String ABNORMAL_CREATE_NAME = "异常中心";
public static final String ABNORMAL_CREATE_EMAIL = "yanxuan@corp.netease.com";
}
package com.netease.mail.yanxuan.change.integration.email.email;
import com.netease.mail.yanxuan.change.integration.email.dto.DeptIdLevelLeaderDTO;
import lombok.Data;
import java.util.List;
@Data
public class DeptIdLevelResponseResult {
private Integer code;
private String errorMsg;
private String errorCode;
private List<DeptIdLevelLeaderDTO> data;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import com.netease.mail.yanxuan.change.integration.email.enums.EmailEhcFlowEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
public class EmailEhcFactor {
/**
* 邮件标题
*/
protected String subject;
/**
* 邮件模版
*/
private EmailEhcFlowEnum emailEhcFlowEnum;
/**
* 邮件模版组装数据对
*/
private Map<String, Object> data;
/**
* 邮件类型
*
* @see EmailTypeEnum
*/
private String type;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import com.netease.mail.yanxuan.change.integration.email.enums.EmailTemplateEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import java.util.Map;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
public class EmailFactor {
private static final String SUBJECT_PREFIX = "【品控工作台】";
protected String subject;
/**
* 邮件模版
*/
private EmailTemplateEnum emailTemplateEnum;
/**
* 邮件模版组装数据对
*/
private Map<String, Object> data;
/**
* 邮件类型
*/
private String type;
public String getSubject() {
String subject = emailTemplateEnum.getSubject();
if(StringUtils.isNotBlank(subject)){
return subject;
}
/*if (data != null) {
Object flowId = data.get(EmailParamEnum.FLOW_ID.getKey());
Object taskType = data.get(EmailParamEnum.TASK_TYPE.getKey());
String format = emailTemplateEnum.getSubject();
if(flowId != null && taskType == null){
return String.format(format, flowId);
}else if(flowId != null && taskType != null){
return String.format(format, taskType, flowId);
}else {
return SUBJECT_PREFIX;
}
}*/
return SUBJECT_PREFIX;
}
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.Data;
@Data
public class EmailTemplateResponResult {
/**
* ResponseCode,状态码
*/
private Integer code;
/**
* 错误说明
*/
private String errorMessage;
/**
* 组装结果
*/
private String data;
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.integration.email.email;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.netease.mail.yanxuan.change.integration.email.conig.RpcTemplate;
import com.netease.mail.yanxuan.change.common.bean.ResponseCode;
import com.netease.mail.yanxuan.change.integration.email.exception.RpcException;
import java.io.IOException;
public class EmailTemplateRpcResult<T> implements RpcTemplate.CallHandler<T> {
private static final String CODE = "code";
private static final String RESULT = "data";
private static final String MESSAGE = "errorMessage";
private Class<T> tClass;
public EmailTemplateRpcResult(Class<T> tClass){
this.tClass = tClass;
}
@Override
public T handle(String resp) throws IOException {
JSONObject rpcResult = JSON.parseObject(resp);
EmailTemplateResponResult responResult = new EmailTemplateResponResult();
int code = rpcResult.getIntValue(CODE);
if(code == ResponseCode.SUCCESS.getCode()){
String data = rpcResult.getString(RESULT);
responResult.setData(data);
return (T) responResult;
}
String errorMessage = rpcResult.getString(MESSAGE);
throw new RpcException("email template response error, code : " + code + " , errorMessage : " + errorMessage);
}
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class FlowEhcOverTimeEmailModel {
/**
* 主工单
*/
private List<OverTimeUserVo> abnormalEhcEmailModels;
/**
* 子工单
*/
private List<TaskEhcFlowOverTimeEmailModel> taskEhcFlowOverTimeEmailModels;
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.integration.email.email;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.netease.mail.yanxuan.change.integration.email.conig.RpcTemplate;
import com.netease.mail.yanxuan.change.common.bean.ResponseCode;
import com.netease.mail.yanxuan.change.integration.email.exception.RpcException;
import com.netease.mail.yanxuan.change.integration.email.dto.UserInfoDTO;
import java.io.IOException;
public class IusRpcResult<T> implements RpcTemplate.CallHandler<T> {
private static final String CODE = "code";
private static final String RESULT = "data";
private static final String ERROR_CODE = "errorCode";
private static final String ERROR_MESSAGE = "errorMsg";
private Class<T> tClass;
public IusRpcResult(Class<T> tClass) {
this.tClass = tClass;
}
@Override
public T handle(String resp) throws IOException {
JSONObject rpcResult = JSON.parseObject(resp);
ResponseResult responResult = new ResponseResult();
int code = rpcResult.getIntValue(CODE);
if (code == ResponseCode.SUCCESS.getCode()) {
String data = rpcResult.getString(RESULT);
UserInfoDTO jsonObject = JSON.parseObject(data, UserInfoDTO.class);
responResult.setData(jsonObject);
return (T) responResult;
}
String errorMessage = rpcResult.getString(ERROR_MESSAGE);
Integer errorCode = rpcResult.getInteger(ERROR_CODE);
throw new RpcException("ius response error, resp=" + JSON.toJSONString(resp) + " , errorCode : " + errorCode
+ " , errorMessage : " + errorMessage);
}
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.Data;
@Data
public class JumpLinkModel {
/**
* 产品号
*/
private String productCode;
/**
* 跳转链接
*/
private String url;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.Builder;
import lombok.Data;
import java.util.List;
@Data
@Builder
public class OverTimeFlowVo {
/**
* 用户邮箱
*/
private String uid;
/**
* 工单列表
*/
private List<OverTimeUserVo> flowIdList;
@Override
protected Object clone() throws CloneNotSupportedException {
OverTimeFlowVo vo = (OverTimeFlowVo) super.clone();
vo.setUid(vo.getUid());
vo.setFlowIdList(BaseConvertor.convert(vo.getFlowIdList(), OverTimeUserVo.class));
return vo;
}
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class OverTimeUserVo {
/**
* 接收人邮箱
*/
private String uid;
/**
* 接收人名字
*/
private String uname;
/**
* 工单id
*/
private String flowId;
/**
* 异常问题名称
*/
private String abnormalName;
/**
* 1:主工单,2:临时措施,3:供应商惩罚,4:批量事件
*
* @see com.netease.mail.yanxuan.ehc.core.meta.enums.FlowCheckTypeEnum
*/
private Integer type;
/**
* 当前节点
*/
private String currentNode;
/**
* 当前节点名称
*/
private String currentNodeName;
/**
* 异常负责人
*/
private String abnormalPrincipalUserName;
/**
* 执行人
*/
private String processUserName;
/**
* 异常问题类型
*/
private Long problemTypeId;
/**
* 异常问题类型名称
*/
private String problemTypeName;
/**
* 对应的监控规则(异常问题工单)
*
* @see com.netease.mail.yanxuan.ehc.core.meta.enums.MonitoringRulesEnum
*/
private String monitoringRule;
/**
* 剩余/延期天数(如果延期展示负数)
*/
private Long surplusDays;
/**
* 时间状态
*
* @see com.netease.mail.yanxuan.ehc.core.meta.enums.EmailTimeStatusEnum
*/
private Integer timeStatus;
/**
* 时间状态
*/
private String timeStatusName;
/**
* 创建时间
*/
private String createTime;
/**
* 截止时间
*/
private String deadLineTime;
/**
* 工单跳转链接
*/
private String flowUrl;
/**
* 部门名称
*/
private String execUserOrgPosName;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Pagination implements Serializable {
/**
* 当前⻚,从1开始
*/
private Integer page;
/**
* ⻚⼤⼩
*/
private Integer size;
/**
* 总⻚数
*/
private Integer totalPage;
/**
* 结果总数
*/
private Integer total;
public Pagination(Integer page, Integer size) {
this.page = page;
this.size = size;
this.total = 0;
this.totalPage = 0;
}
}
package com.netease.mail.yanxuan.change.integration.email.email;
import com.netease.mail.yanxuan.qc.service.client.meta.abnormal.LabelModel;
import lombok.Data;
import java.util.List;
@Data
public class ProblemConfigureModel {
/**
* 问题类型配置表id
*/
private Long problemTypeId;
/**
* 异常环节
*/
private List<LabelModel> abnormalLinks;
/**
* 问题分类
*/
private List<LabelModel> flowProblems;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import com.netease.mail.yanxuan.change.integration.email.dto.UserInfoDTO;
import lombok.Data;
import java.util.List;
@Data
public class QueryUserInfoResponseResult {
private Integer code;
private String errorMsg;
private String errorCode;
private List<UserInfoDTO> data;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.Data;
import java.util.List;
@Data
public class QueryUserInfoVO {
/**
* uid
*/
private List<String> uids;
/**
* 物流单号
*/
private Boolean locked;
/**
* 创建时间区间
*/
private Long startCreateTime;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.Data;
@Data
public class ResponseResult {
private Integer code;
private Integer errorCode;
private Object data;
private String errorMsg;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import com.netease.yanxuan.flowx.sdk.meta.dto.base.UserBaseDTO;
import lombok.Data;
import java.util.List;
@Data
public class RoleResponseResult {
private Integer code;
private Integer errorCode;
private List<UserBaseDTO> data;
private String errorMsg;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import com.alibaba.fastjson.JSON;
import com.netease.mail.yanxuan.change.integration.email.conig.RpcTemplate;
import java.io.IOException;
/**
* 直接序列化返回对象
*
* @author lwtang
* @date 2019-02-20
*/
public class RpcObjectHandler<T> implements RpcTemplate.CallHandler<T> {
private Class<T> tClass;
public RpcObjectHandler(Class<T> tClass) {this.tClass = tClass;}
@Override
public T handle(String resp) throws IOException {
return JSON.parseObject(resp, tClass);
}
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class SearchResult<T> {
private Pagination pagination;
private List<T> result;
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.Data;
@Data
public class SupplierEmailResponseResult {
private Integer code;
private String desc;
private Object data;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.Data;
@Data
public class SupplierEmailSendReq {
/**
* 供应商id
*/
private String supplierId;
/**
* 标题
*/
private String mailSubject;
/**
* 内容
*/
private String mailContent;
private Integer isAllAccountResolved = 1;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TaskEhcFlowOverTimeEmailModel {
private String taskFlowId;
private String url;
private String abnormalName;
/**
* @see com.netease.mail.yanxuan.ehc.core.meta.enums.AllTaskFlowTypeEnum
*/
private String taskFlowType;
private String uid;
private String uname;
/**
* 待处理人
*/
private String processUserName;
/**
* @see com.netease.mail.yanxuan.ehc.core.meta.enums.EmailTimeStatusEnum
*/
private String timeStatusName;
private String createTime;
private String expectedFinishTime;
private Long delayDay;
/**
* 部门
*/
private String execUserOrgPosName;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import com.netease.mail.yanxuan.change.integration.email.dto.UserUniteOrgMetaDTO;
import lombok.Data;
import java.util.List;
@Data
public class UserUniteOrgMetaResponseResult {
private Integer code;
private String errorMsg;
private String errorCode;
private List<UserUniteOrgMetaDTO> data;
}
package com.netease.mail.yanxuan.change.integration.email.email;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserVO {
/**
* 用户名
*/
private String userName;
/**
* 用户邮箱
*/
private String userEmail;
/**
* 用户部门
*/
private Long orgId;
/**
用户部门名称
*/
private String orgName;
}
package com.netease.mail.yanxuan.change.integration.email.enums;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.util.CollectionUtils;
public enum AllTaskFlowTypeEnum {
/**
* 临时措施
*/
TEMPORARY_MEASURE(1,"临时措施"),
/**
* 纠正措施
*/
CORRECT_MEASURE(2,"纠正措施"),
/**
* 验证结果
*/
VERIFY_RESULT(3,"验证结果"),
/**
* 供应商惩罚措施工单
*/
SUPPLIER_PUNISHMENT(4, "供应商惩罚措施"),
/**
* 批量事件工单
*/
BATCH_EVENT(5, "批量事件");
private Integer type;
private String name;
AllTaskFlowTypeEnum(Integer type, String name) {
this.type = type;
this.name = name;
}
public static String getName(Integer type) {
List<AllTaskFlowTypeEnum> list = Arrays.stream(AllTaskFlowTypeEnum.values())
.filter(e -> e.getType().equals(type)).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(list)) {
return list.get(0).getName();
}
return "";
}
public Integer getType() {
return type;
}
public String getName() {
return name;
}
}
package com.netease.mail.yanxuan.change.integration.email.enums;
public enum EmailEhcFlowEnum {
/**
* 异常任务工单邮件
*/
YX_EHC_CREATE_TASK_SUBMIT("ehc_create_task_submit","创建临时/纠正措施/验证任务_提交", "【待处理】异常处理-%s 任务:%s 任务工单ID:%s",
"你好,由%s 发起的异常问题任务工单:%s ,工单ID:%s,请尽快前往处理"),
YX_EHC_CREATE_TASK_CANCEL("ehc_create_task_cancel","创建临时/纠正措施/验证任务_取消", "【已取消】异常处理-%s 任务:%s 任务工单ID:%s ",
"你好,由%s 发起的异常问题任务工单:%s ,工单ID:%s ,已被 %s %s 操作取消,请前往查看详情"),
YX_EHC_PROCESS_RESULT_CARE_OF("ehc_process_result_care_of","填写任务处理结果_转交", "【待处理】异常处理-%s 任务:%s 任务工单ID:%s ",
"你好,由%s 发起的异常问题任务工单:%s,工单ID:XXX,现由 %s %s 转交给你,请尽快前往处理"),
YX_EHC_PROCESS_RESULT_SUBMIT("ehc_process_result_submit","填写任务处理结果_提交", "【待审批】异常处理-%s 任务:%s 任务工单ID:%s",
"你好,由%s 发起的异常问题任务工单:%s ,工单ID:XXX,由 %s %s 完成了问题处理,需要审批,请尽快前往处理"),
YX_EHC_TASK_RELEASE_CARE_OF("ehc_task_release_care_of","任务工单发起人审批_转交", "【待审批】异常处理-%s 任务:%s 任务工单ID:%s ",
"你好,由%s 发起的异常问题任务工单:%s,工单ID:XXX,由 %s %s 完成了问题处理,需要审批,现由 %s %s 转交给你,请尽快前往处理"),
YX_EHC_TASK_RELEASE_CHECK_NOT_PASS("ehc_task_release_check_not_pass","任务工单发起人审批_不通过", "【被驳回】异常处理-%s 任务:%s 任务工单ID:%s",
"你好,由%s 发起的异常问题任务工单:%s,工单ID:%s,被 %s %s 驳回,请尽快前往处理"),
/**
* 供应商惩罚工单邮件
*/
YX_EHC_CREATE_SUPPLIER_TASK_SUBMIT("ehc_create_supplier_task_submit","创建供应商惩罚任务_提交", "【待处理】异常处理-供应商惩罚任务:%s 任务工单ID:%s ",
"你好,由%s 发起的供应商惩罚任务工单:%s,工单ID:%s,请尽快前往处理"),
YX_EHC_CREATE_SUPPLIER_TASK_CARE_OF("ehc_create_supplier_task_care_of","创建供应商惩罚任务_转交", "【待处理】异常处理-供应商惩罚任务:%s 任务工单ID:%s ",
"你好,由%s 发起的供应商惩罚任务工单:%s,工单ID:%s,现由(%s %s)转交给你,请尽快前往处理"),
YX_EHC_SUPPLIER_RESULT_SUBMIT("ehc_supplier_process_result_submit","采购回填供应商处理结果_提交", "【待审批】异常处理-供应商惩罚任务:%s 任务工单ID:%s ",
"你好,由%s 发起的供应商惩罚任务工单:%s,工单ID:%s,由(%s %s)完成了问题处理,需要审批,请尽快前往处理"),
YX_EHC_SUPPLIER_RELEASE_CHECK_CARE_OF("ehc_supplier_release_check_care_of","工单发起人审批节点_转交", "【待审批】异常处理-供应商惩罚任务:%s 任务工单ID:%s",
"你好,由%s 发起的供应商惩罚任务工单:%s,工单ID:%s,由(%s %s)完成了问题处理,需要审批,现由(%s %s)转交给你,请尽快前往处理"),
YX_EHC_SUPPLIER_RELEASE_CHECK_PASS_OVER("ehc_supplier_release_check_pass_over","工单发起人审批节点_审核通过", "【已完结】异常处理-供应商惩罚任务:%s 任务工单ID:%s ",
"你好,由%s 发起的供应商惩罚任务工单:%s,工单ID:%s,已完成处理,请前往查看详情"),
YX_EHC_SUPPLIER_RELEASE_CHECK_NOT_PASS_BUY("ehc_supplier_release_check_not_pass_buy","工单发起人审批节点_审核不通过", "【被驳回】异常处理-供应商惩罚任务:%s 任务工单ID:%s ",
"你好,由%s 发起的供应商惩罚任务工单:%s,工单ID:%s,被(%s %s)驳回,请尽快前往处理"),
YX_EHC_CREATE_SUPPLIER_CANCEL("ehc_create_supplier_cancel","创建供应商惩罚任务_取消", "【已取消】异常处理-供应商惩罚任务:%s 任务工单ID:%s ",
"你好,由%s 发起的供应商惩罚任务工单:%s ,工单ID:%s ,已被 %s %s 操作取消,请前往查看详情"),
/**
* 批量事件工单邮件
*/
YX_EHC_CREATE_EVENT_TASK_SUBMIT("ehc_create_event_task_submit","创建批量事件任务_提交","【待处理】异常处理-批量事件记录任务:%s 任务工单ID:%s ",""),
YX_EHC_CREATE_EVENT_TASK_DELIVER("ehc_create_event_task_deliver","处理批量事件任务_转交","【待处理】异常处理-批量事件记录任务:%s 任务工单ID:%s ",""),
YX_EHC_CREATE_EVENT_TASK_CANCEL("ehc_create_event_task_cancel","创建批量事件任务_取消","【已取消】异常处理-批量事件记录任务:%s 任务工单ID:%s",""),
/**
* 临期/过期工单邮件
*/
YX_EHC_FLOW_OVER_TIME("ehc_flow_over_time","临期/过期工单监控","ECR异常临期及延期任务工单提醒",""),
/********************************** 异常问题主工单邮件模板 **********************************/
YX_EHC_ABNORMAL_PROCESS("ehc_abnormal_process_template","待处理人处理邮件(非驳回)", "【待处理】异常问题:%s 工单ID:%s",
""),
YX_EHC_ABNORMAL_AUDIT("ehc_abnormal_audit_template","待审核人审核邮件", "【待审批】异常问题:%s 工单ID:%s",
""),
YX_EHC_ABNORMAL_DELIVER_PROCESS("ehc_abnormal_deliver_process_template","待转交人处理邮件", "【待处理】异常问题:%s 工单ID:%s",
""),
YX_EHC_ABNORMAL_DELIVER_AUDIT("ehc_abnormal_deliver_audit_template","待转交人审核邮件", "【待审批】异常问题:%s 工单ID:%s",
""),
YX_EHC_ABNORMAL_REFUSE("ehc_abnormal_refuse_template","被驳回待处理邮件", "【被驳回】异常问题:%s 工单ID:%s",
""),
YX_EHC_ABNORMAL_END("ehc_abnormal_end_template","已完结通知邮件", "【已完结】异常问题:%s 工单ID:%s",
""),
;
/**
* 模版code
*/
private String code;
/**
* 模版名称
*/
private String name;
/**
* 邮件标题format
*/
private String subject;
/**
* 邮件内容
*/
private String content;
EmailEhcFlowEnum(String code, String name, String subject, String content) {
this.code = code;
this.name = name;
this.subject = subject;
this.content = content;
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
public String getSubject() {
return subject;
}
public String getContent() {
return content;
}
}
package com.netease.mail.yanxuan.change.integration.email.enums;
public enum EmailParamEnum {
FLOW_ID("flowId", "工单ID"),
RELEASE_ID("releaseId", "发起人账号"),
RELEASE_NAME("releaseName", "发起人姓名"),
RELEASE_RMAIL("releaseEmail", "发起人邮箱"),
ABNORMAL_TITLE("abnormalTitle", "异常标题"),
FLOW_LINK("flowLink", "工单链接"),
CARE_OF_NAME("careOfName", "转交人姓名"),
CARE_OF_EMAIL("careOfEmail", "转交人邮箱"),
ABNORMAL_DUTY_NAME("abnormalDutyName", "异常责任人姓名"),
ABNORMAL_DUTY_EMAIL("abnormalDutyEmail", "异常责任人邮箱"),
GROUP_LEADER_NAME("groupLeaderName", "组长姓名"),
GROUP_LEADER_EMAIL("groupLeaderEmail", "组长邮箱"),
ABNORMAL_CHECK_NAME("abnormalCheckName", "异常审批人姓名"),
ABNORMAL_CHECK_EMAIL("abnormalCheckEmail", "异常审批人邮箱"),
REJECT_NAME("rejectName", "驳回人姓名"),
REJECT_EMAIL("rejectEmail", "驳回人邮箱"),
TASK_TYPE("taskType", "异常任务类型"),
TASK_PROCESS_NAME("taskProcessName", "任务处理人姓名"),
TASK_PROCESS_EMAIL("taskProcessEmail", "任务处理人邮箱"),
CHECK_NAME("checkName", "审批人姓名"),
CHECK_EMAIL("checkEmail", "审批人邮箱"),
NAME("name", "姓名"),
FIND_TIME("findTime", "发现时间"),//yyyy-MM-dd HH:mm:ss
FIND_DES("findDes", "发现人描述"),
SERVICE_CODE("serviceCode", "服务平台"),
ABNORMAL_FLOW_TYPE("abnormalFlowType", "异常种类"),
CREATE_TIME("createTime", "异常创建时间"),
ABNORMAL_TASK_DES("abnormalTaskDes", "任务描述"),
BREACH_OF_CONTRACT_TYPE("breachOfContractType", "违约类型"),
RESPONSIBILITY("responsibility", "责任判定"),
/**
* 查询数仓
*/
QUERY_PART("queryPart", "查询部分"),
/**
* 监控过期或临期工单
*/
TITLE("title", "提示文案"),
ABNORMAL_PROBLEM_FLOW_LIST_DEC("abnormalProblemFlowListDec", "判定异常等级制定临时措施临期延期提醒"),
ABNORMAL_PROBLEM_FLOW_LIST_CAU("abnormalProblemFlowListCau", "原因分析和纠正措施、标准化和验证措施临期延期提醒"),
ABNORMAL_PROBLEM_FLOW_LIST("abnormalProblemFlowList", "异常工单临期延期提醒"),
ABNORMAL_TASK_FLOW_LIST("abnormalTaskFlowList", "任务工单临期延期提"),
TEST("test", "测试");
private String key;
private String info;
EmailParamEnum(String key, String info){
this.key = key;
this.info = info;
}
public String getKey() {
return key;
}
}
package com.netease.mail.yanxuan.change.integration.email.enums;
public enum EmailTemplateEnum {
/**
* 异常问题跟进工单邮件
*/
YX_QC_RELEASE_FLOW("yxqc_release_flow","品控发起工单", "【ECR异常工单新建】 %s,请判定异常等级和制定临时措施"),
YXQC_RELEASE_FLOW_KONW_PE("yxqc_release_flow_know_pe","品控发起工单_被周知人", "【ECR异常工单新建】 %s,请知悉"),
YX_QC_DECIDE_CARE_OF("yxqc_decide_care_of","品控判定异常等级制定临时措施_转交", "【ECR异常工单跟进】 %s,请判定异常等级和制定临时措施"),
YX_QC_DECIDE_SUBMIT("yxqc_decide_submit","品控判定异常等级制定临时措施_提交", "【ECR异常工单审批】 %s,请审批异常等级和临时措施"),
YX_QC_GROUP_LEADER_CHECK_CARE_OF("yxqc_group_leader_check_care_of","组长审批_转交", "【ECR异常工单审批】 %s,请审批异常等级和临时措施"),
YX_QC_GROUP_LEADER_CHECK_PASS_NOT_ABNORMAL("yxqc_group_leader_check_pass_not_abnormal","组长审批_审批通过_异常审批人审批关联工单/非异常问题" , "【ECR异常工单审批】 %s,请审批异常等级和临时措施"),
YX_QC_GROUP_LEADER_CHECK_PASS_METHOD("yxqc_group_leader_check_pass_method","组长审批_审批通过_原因分析和纠正措施、标准化和验证措施", "【ECR异常工单跟进】 %s,请分析原因和制定纠正措施"),
YX_QC_GROUP_LEADER_NOT_PASS("yxqc_group_leader_not_pass","组长审批_不通过_判定异常等级制定临时措施", "【ECR异常工单驳回请跟进】 %s,请判定异常等级和制定临时措施"),
YX_QC_ABNORMAL_NOT_PROBLEM_CARE_OF("yxqc_abnormal_not_problem_care_of","品控_异常审批人审批关联工单/非异常问题_转交", "【ECR异常工单审批】 %s,请审批异常等级和临时措施"),
YX_QC_ABNORMAL_NOT_PROBLEM_OVER("yxqc_abnormal_not_problem_over","品控_异常审批人审批关联工单/非异常问题_完结", "【ECR异常工单完结】 %s,请知悉"),
YX_QC_ABNORMAL_NOT_PROBLEM_NOT_PASS("yxqc_abnormal_not_problem_not_pass","品控_异常审批人审批关联工单/非异常问题_不通过", "【ECR异常工单驳回请跟进】 %s,请判定等级和制定临时措施"),
YX_QC_CAUSE_MEASURE_CARE_OF("yxqc_cause_measure_care_of","品控_原因分析和纠正措施、标准化和验证措施_转交", "【ECR异常工单跟进】 %s,请分析原因和制定纠正措施"),
YX_QC_CAUSE_MEASURE_SUBMIT("yxqc_cause_measure_submit","品控_原因分析和纠正措施、标准化和验证措施_提交", "【ECR异常工单审批】 %s,请审批原因分析和纠正措施"),
YX_QC_ABNORMAL_CHECK_METHOD_CARE_OF("yxqc_abnormal_check_method_care_of","品控_异常审批人审核异常处理方式_转交", "【ECR异常工单审批】 %s,请审批原因分析和纠正措施"),
YX_QC_ABNORMAL_CHECK_METHOD_PASS("yxqc_abnormal_check_method_pass","品控_异常审批人审核异常处理方式_审批通过", "【ECR异常工单跟进】 %s,请确认全部任务完成"),
YX_QC_ABNORMAL_CHECK_METHOD_NOT_PASS("yxqc_abnormal_check_method_not_pass","品控_异常审批人审核异常处理方式_审批不通过", "【ECR异常工单驳回请跟进】 %s,请分析原因和制定纠正措施"),
YX_QC_ABNORMAL_CHECK_METHOD_NOT_PASS_DECIDE("yxqc_abnormal_check_method_not_pass_decide","品控_异常审批人审核异常处理方式_审批不通过_判定异常等级制定临时措施", "【ECR异常工单驳回请跟进】 %s,请判定异常等级和制定临时措施"),
YX_QC_CONFIRM_METHOD_OVER_SUBMIT("yxqc_confirm_method_over_submit","品控_确认临时措施和纠正措施任务全部完成_提交", "【ECR异常工单审批】 %s,请审批所有任务处理结果"),
YX_QC_ABNORMAL_CHECK_RESULT_NOT_PASS_CONFIRM_METHOD_OVER("yxqc_abnormal_check_result_not_pass_confirm_method_over","品控_异常审批人审核异常处理结果_审批不通过_确认临时措施和纠正措施任务全部完成", "【ECR异常工单驳回请跟进】 %s,请完成全部任务"),
YX_QC_ABNORMAL_CHECK_RESULT_NOT_PASS_CAUSE_METHOD("yxqc_abnormal_check_result_not_pass_cause_method","品控_异常审批人审核异常处理结果_审批不通过_原因分析和纠正措施、标准化和验证措施", "【ECR异常工单驳回请跟进】 %s,请分析原因和制定纠正措施"),
YX_QC_ABNORMAL_CHECK_RESULT_NOT_PASS_DECIDE("yxqc_abnormal_check_result_not_pass_decide","品控_异常审批人审核异常处理结果_审批不通过_判定异常等级制定临时措施", "【ECR异常工单驳回请跟进】 %s,请判定异常等级和制定临时措施"),
YX_QC_ABNORMAL_CHECK_RESULT_PASS_OVER("yxqc_abnormal_check_result_pass_over","品控_异常审批人审核异常处理结果_审批通过_完结", "【ECR异常工单完结】 %s,请知悉"),
YX_QC_ABNORMAL_CHECK_RESULT_PASS_BIGGER_CHECK("yxqc_abnormal_check_result_pass_bigger_check","品控_异常审批人审核异常处理结果_审批通过_项目部老大&品控负责人审批", "【ECR异常工单审批】 %s,请审批"),
YX_QC_BIGGER_CHECK_CARE_OF_BIGGER_CHECK("yxqc_bigger_check_care_of_bigger_check","品控_项目部老大&品控负责人审批节点_转交_项目部老大&品控负责人审批节点", "【ECR异常工单审批】 %s,请审批"),
YX_QC_BIGGER_CHECK_PASS_OVER("yxqc_bigger_check_pass_over","品控_项目部老大&品控负责人审批节点_审核通过_完结", "【ECR异常工单完结】 %s,请知悉"),
YX_QC_BIGGER_CHECK_NOT_PASS("yxqc_bigger_check_not_pass","品控_项目部老大&品控负责人审批节点_审核不通过", "【ECR异常工单驳回请跟进】 %s,请判定异常等级和制定临时措施"),
/**
* 异常任务工单邮件
*/
YX_QC_CREATE_TASK_SUBMIT("yxqc_create_task_submit","品控_创建临时/纠正措施/验证任务_提交", "【ECR任务工单新建】%s,请跟进%s任务"),
YX_QC_CREATE_TASK_REVOKE("yxqc_create_task_revoke","品控_创建临时/纠正措施/验证任务_撤回", "【ECR任务工单撤回】%s,请知悉"),
YX_QC_PROCESS_RESULT_CARE_OF("yxqc_process_result_care_of","品控_填写任务处理结果_转交", "【ECR任务工单跟进】%s,请跟进%s任务"),
YX_QC_PROCESS_RESULT_SUBMIT("yxqc_process_result_submit","品控_填写任务处理结果_提交", "【ECR任务工单审批】%s,请审批%s任务"),
YX_QC_TASK_RELEASE_CARE_OF("yxqc_task_release_care_of","品控_任务工单发起人审批_转交", "【ECR任务工单审批】%s,请审批%s任务"),
YX_QC_TASK_RELEASE_CHECK_PASS("yxqc_task_release_check_pass","品控_任务工单发起人审批_通过", "【ECR任务工单完结】%s,请知悉"),
YX_QC_TASK_RELEASE_CHECK_NOT_PASS("yxqc_task_release_check_not_pass","品控_任务工单发起人审批_不通过", "【ECR任务工单驳回请跟进】%s,请跟进%s任务"),
/**
* 异常问题供应商惩罚任务工单
*/
YX_QC_CREATE_SUPPLIER_TASK_SUBMIT("yxqc_create_supplier_task_submit","品控_创建供应商惩罚任务_提交", "【ECR任务工单新建】%s,请跟进供应商惩罚工单"),
YX_QC_CREATE_SUPPLIER_TASK_CARE_OF("yxqc_create_supplier_task_care_of","品控_创建供应商惩罚任务_转交", "【ECR任务工单跟进】%s,请跟进供应商惩罚工单"),
YX_QC_SUPPLITER_RESULT_SUBMIT("yxqc_supplier_process_result_submit","品控_采购回填供应商处理结果_提交", "【ECR任务工单审批】%s,请审批供应商惩罚工单"),
YX_QC_TASK_RELEASE_CHECK_CARE_OF("yxqc_task_release_check_care_of","品控_工单发起人审批节点_转交", "【ECR任务工单审批】%s,请审批供应商惩罚工单"),
YX_QC_TASK_RELEASE_CHECK_PASS_OVER("yxqc_task_release_check_pass_over","品控_工单发起人审批节点_审核通过", "【ECR任务工单完结】%s,请知悉"),
YX_QC_TASK_RELEASE_CHECK_NOT_PASS_BUY("yxqc_task_release_check_not_pass_buy","品控_工单发起人审批节点_审核不通过", "【ECR任务工单驳回请跟进】%s,请跟进供应商惩罚工单"),
/**
* 查询数仓相关
*/
YX_QC_TASK_QUERY_DPS_NOT_DATA("yx_qc_query_dqs_not_data","品控_查询_数仓_无数据", ""),
/**
* 监控过期或临期工单
*/
YX_QC_CONTROL_EXPIRE_ADVENT_FLOW("yx_qc_control_expire_advent_flow","品控_监控_过期临期_工单", "【ECR异常、任务工单】临期、延期提醒"),
YX_QC_TEST("yxqc_test","品控测试", "");
/**
* 模版code
*/
private String code;
/**
* 模版名称
*/
private String name;
/**
* 邮件标题format
*/
private String subject;
EmailTemplateEnum(String code, String name, String subject){
this.code = code;
this.name = name;
this.subject = subject;
}
public String getCode(){
return code;
}
public String getSubject(){
return subject;
}
}
package com.netease.mail.yanxuan.change.integration.email.enums;
public enum EmailType {
NULL(""), //NULL
RPC("RPC"), //RPC请求
HTTP("HTTP"), //HTTP请求
CACHE("CACHE"), //缓存问题
DB("DB"), //DB问题
MQ("MQ"), //消息队列问题
PARAM("PARAM"), //入参问题
SERVICE("SERVICE"), //业务逻辑问题
EXT_DEPENDENCY("EXT_DEPENDENCY"); //外部依赖问题
private String value;
private EmailType(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.integration.email.enums;
public enum EmailTypeEnum {
TEXT("text"),
HTML("html");
private String type;
EmailTypeEnum(String type){
this.type = type;
}
public String getType(){
return this.type;
}
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.integration.email.enums;
import lombok.AllArgsConstructor;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.util.CollectionUtils;
@AllArgsConstructor
public enum ExecUserTypeEnum {
YANXUAN_MEMBER(1,"严选人员"),
SUPPLIER(2,"供应商"),
LOGISTICS_SERVICE_PROVIDER(3,"物流服务商"),
WAREHOUSE_SERVICE_PROVIDER(4,"仓库服务商"),
RETURN_WAREHOUSE_SERVICE_PROVIDER(5,"退货仓服务商");
private int value;
private String name;
public static String getName(Integer type) {
List<ExecUserTypeEnum> collect = Arrays.stream(ExecUserTypeEnum.values())
.filter(e -> e.getValue().equals(type)).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(collect)) {
return collect.get(0).getName();
}
return "";
}
public String getName() {
return name;
}
public Integer getValue() {
return value;
}
}
package com.netease.mail.yanxuan.change.integration.email.enums;
public enum OrgUserTypeEnum {
STAFF(0, "普通员工"),
INSTRUCTOR(1, "指导员"),
PRINCIPAL(2, "负责人");
/**
* 属性值
*/
private int value;
/**
* 属性名称
*/
private String name;
public static OrgUserTypeEnum getByValue(int result) {
for (OrgUserTypeEnum w: OrgUserTypeEnum.values()) {
if (w.getValue() == result) {
return w;
}
}
return null;
}
OrgUserTypeEnum(int value, String name) {
this.value = value;
this.name = name;
}
public int getValue() {
return value;
}
public String getName() {
return name;
}
}
package com.netease.mail.yanxuan.change.integration.email.enums;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public enum ProductCodeEnum {
/**
* 异常管理中心
*/
EHC("ehc", "异常管理中心"),
/**
* 品控
*/
QC("qc", "品控"),
/**
* 承运商平台
*/
CARRIER("carrier", "承运商"),
/**
* 仓配
*/
ARK("ark", "仓配"),
/**
* 商品中心
*/
ITEM_CENTER("ic", "商品中心"),
/**
* 同舟系统
*/
SUPPLIER_API("supplier_api", "同舟"),
/**
* 大黄蜂
*/
HORNET("hornet", "大黄蜂"),
/**
* 供应商协同
*/
YXSUPPLIER("yxsupplier", "供应商协同"),
/**
* 采购
*/
PMC("pmc", "采购"),
/**
* 逆向管理系统
*/
SUPPLIER_RL("yanxuan-supplier-rl", "逆向管理系统"),
/**
* 销退系统
*/
SALES_RETURN("yanxuan-sales-return", "销退系统");
public static ProductCodeEnum getByValue(String code) {
for (ProductCodeEnum c: ProductCodeEnum.values()) {
if (c.getCode().equals(code)) {
return c;
}
}
return null;
}
private String code;
private String name;
public String getCode() {
return code;
}
public String getName() {
return name;
}
}
package com.netease.mail.yanxuan.change.integration.email.enums;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public enum StaffStatusEnum {
/**
* 正式
*/
OFFICIAL(0, "正式"),
/**
* 试用
*/
TRIAL(1, "试用"),
/**
* 外包
*/
WB(2, "外包"),
/**
* 离职
*/
DIMISSION(6, "离职"),
;
public static StaffStatusEnum getByValue(Integer code) {
for (StaffStatusEnum c: StaffStatusEnum.values()) {
if (c.getType().equals(code)) {
return c;
}
}
return null;
}
private Integer type;
private String name;
public Integer getType() {
return type;
}
public String getName() {
return name;
}
}
package com.netease.mail.yanxuan.change.integration.email.exception;
/**
* @author lwtang
* @date 2019-02-19
*/
public class RpcConnectException extends RpcException{
public RpcConnectException(String message) {
super(message);
}
}
package com.netease.mail.yanxuan.change.integration.email.exception;
/**
* @author lwtang
* @date 2019-02-19
*/
public class RpcException extends RuntimeException {
public RpcException(String message) {
super(message);
}
public RpcException(Throwable t) {
super(t);
}
public RpcException(String message, Throwable t) {
super(message, t);
}
}
package com.netease.mail.yanxuan.change.integration.email.exception;
import com.netease.mail.yanxuan.change.integration.email.exception.RpcException;
/**
* http status code 非 200
*
* @author lwtang
* @date 2019-02-19
*/
public class RpcStatusException extends RpcException {
private int code;
public RpcStatusException(int code, String message) {
super(message);
this.code = code;
}
public int getCode() {
return this.code;
}
}
package com.netease.mail.yanxuan.change.integration.email.exception;
/**
* @author lwtang
* @date 2019-02-19
*/
public class RpcTimeoutException extends RpcException {
public RpcTimeoutException(String message) {
super(message);
}
}
package com.netease.mail.yanxuan.change.integration.email.service;
import com.netease.mail.yanxuan.change.integration.email.email.*;
import com.netease.mail.yanxuan.change.integration.email.enums.EmailEhcFlowEnum;
import java.io.File;
import java.util.Collection;
import java.util.List;
public interface IEmailEhcService {
/**
* 任务工单发送邮件
*
* @param toList
* 收件人列表
* @param ccList
* 抄送人列表
* @param model
* 要素
* @param emailEhcFlowEnum
*/
void sendTaskEmail(Collection<String> toList, Collection<String> ccList, AbnormalTaskFlowEhcEmailModel model,
EmailEhcFlowEnum emailEhcFlowEnum);
/**
* 供应商专属邮件发送
*
* @param supplierId
* @param model
* @param emailEhcFlowEnum
*/
void sendSupplierEmail(String supplierId, AbnormalTaskFlowEhcEmailModel model, EmailEhcFlowEnum emailEhcFlowEnum);
/**
* 供应商惩罚工单发送邮件
*
* @param toList
* @param ccList
* @param model
* @param emailEhcFlowEnum
*/
void sendPunishEmail(Collection<String> toList, Collection<String> ccList, AbnormalPunishFlowEhcEmailModel model,
EmailEhcFlowEnum emailEhcFlowEnum);
/**
* 异常问题工单发送邮件
*
* @param toList
* 收件人列表
* @param ccList
* 抄送人列表.
* @param emailEhcFlowEnum
* 邮件模板
* @param abnormalEhcEmailModel
* 数据
*/
void sendAbnormalEmail(Collection<String> toList, Collection<String> ccList, EmailEhcFlowEnum emailEhcFlowEnum,
AbnormalEhcEmailModel abnormalEhcEmailModel);
/**
* 批量事件工单发送邮件
*
* @param toList
* @param ccList
* @param model
* @param
*/
void sendBathEventEmail(Collection<String> toList, Collection<String> ccList, AbnormalBathEventEhcEmailModel model,
EmailEhcFlowEnum emailEhcFlowEnum);
/**
* 临期/过期工单发送邮件
*
* @param toList
* @param ccList
* @param model
* @param emailEhcFlowEnum
*/
void sendOverTimeEmail(Collection<String> toList, Collection<String> ccList, FlowEhcOverTimeEmailModel model,
EmailEhcFlowEnum emailEhcFlowEnum);
/**
* 邮件发送
*
* @param toList
* 收件人列表
* @param ccList
* 抄送人列表
* @param factor
* 要素
* @param fileList
* 附件
*/
void sendEmail(Collection<String> toList, Collection<String> ccList, EmailEhcFactor factor, List<File> fileList);
/**
* 获取邮件发送工单地址
*
* @param uid
* @return
*/
String getEmailContentUrl(String uid);
/**
* 获取异常任务工单邮件发送地址
*
* @param uid
* @param execUserType
* @return
*/
String getTaskFlowEmailUrl(String uid, Integer execUserType);
}
package com.netease.mail.yanxuan.change.integration.email.service;
import com.netease.mail.yanxuan.change.integration.email.email.EmailFactor;
import java.io.File;
import java.util.Collection;
import java.util.List;
/**
* 发送邮件
*/
public interface IEmailService {
/**
* @param to 收件人
* @param emailFactor 邮件要素
*/
void sendEmail(String to, EmailFactor emailFactor);
/**
* @param toList 收件人列表
* @param factor 要素
*/
void sendEmail(Collection<String> toList, EmailFactor factor);
/**
* @param toList 收件人
* @param ccList 抄送人
* @param factor 要素
* @param fileList 附件
*/
void sendEmail(String toList, String ccList, EmailFactor factor,List<File> fileList);
/**
*
* @param toList 收件人列表
* @param ccList 抄送人列表
* @param factor 要素
*/
void sendEmail(Collection<String> toList, Collection<String> ccList, EmailFactor factor);
/**
* @param toList 收件人列表
* @param ccList 抄送人列表
* @param factor 要素
* @param fileList 附件
*/
void sendEmail(Collection<String> toList, Collection<String> ccList, EmailFactor factor, List<File> fileList);
}
package com.netease.mail.yanxuan.change.integration.email.service;
import java.util.List;
import com.netease.mail.yanxuan.change.integration.email.dto.DeptIdLevelLeaderDTO;
import com.netease.mail.yanxuan.change.integration.email.dto.ThirdOrgPosDTO;
import com.netease.mail.yanxuan.change.integration.email.dto.UserInfoDTO;
import com.netease.mail.yanxuan.change.integration.email.dto.UserUniteOrgMetaDTO;
import com.netease.mail.yanxuan.change.integration.email.email.SearchResult;
import com.netease.mail.yanxuan.change.integration.email.dto.UserProductRoleStaticsInfosDTO;
import com.netease.mail.yanxuan.change.integration.email.email.UserVO;
import com.netease.yanxuan.flowx.sdk.meta.dto.base.UserBaseDTO;
/**
* @author jiyuwang 商品是否有模块化受控标准
*/
public interface IIusService {
/**
* 获取用户的部门信息和在职情况
*
* @param uid
* @return
*/
UserInfoDTO getUserInfo(String uid);
/**
* 查询用户集合,不传时查全部
* http://yx.mail.netease.com/bee#/interface/list;serviceCode=yanxuan-ius;branchName=master;selectedInterface=1010712
* @param productCode
* @param uid
* @return
*/
List<UserInfoDTO> queryUserInfo(String productCode, String uid);
/**
* 根据uid获取部门
*
* @param uid
* @return
*/
String getOrgByUid(String uid);
/**
* 判断用户是否离职
*
* @param uid
* @return true: 离职;false: 未离职
*/
boolean checkUserIsLeave(String uid);
/**
* 获取部门负责人
*
* @param uid
* @param orgPosId
* @return
*/
List<DeptIdLevelLeaderDTO> getDeptIdLevelLeader(String uid, Integer orgPosId);
/**
* 根据用户获取三级部门负责人
*
* @param uid
* @return
*/
List<DeptIdLevelLeaderDTO> getThreeLevelDeptLeader(String uid);
/**
* 获取四级部门负责人
* @param uid
* @return
*/
List<DeptIdLevelLeaderDTO> getForthLevelDeptLeader(String uid);
/**
* 模糊查询用户信息
*/
List<UserUniteOrgMetaDTO> fuzzyQueryUserInformation(int queryType, String keyword);
/**
* 模糊查询用户信息(权限中心)
*/
List<UserUniteOrgMetaDTO> fuzzyQueryUserInfo(Long orgPosId, int level, int type, int queryType, String keyword);
/**
* 获得该系统下的该用户组织身份权限或者特殊权限
*
* @param staff
* @param roleId
* @param orgPosId
* @param stationId
* @param locked
* @param keyword
* @param curPage
* @param pageSize
* @return
*/
SearchResult<UserProductRoleStaticsInfosDTO> getAllUserProductRoleInfos(Integer staff, Long roleId, Long orgPosId,
Integer stationId, Integer locked, String keyword, Integer curPage, Integer pageSize);
/**
* 根据产品号和 roleId 获取用户列表
*
* @param productCode
* @param roleId
* @return
*/
List<UserBaseDTO> listUserByRoleId(String productCode, Long roleId);
/**
* 根据uid获取三级部门人员相关信息
* @param uid
* @return
*/
UserVO lv3UserInfo(String uid);
/**
* 获取用户所在系统编码(弃用)
*
* @param uid
* @return
*/
@Deprecated
List<String> listProductHasUid(String uid);
/**
* 三级部门查询列表
* @param name
* @return
*/
List<ThirdOrgPosDTO> getThirdOrgPosName(String name);
}
package com.netease.mail.yanxuan.change.integration.email.service;
import com.netease.mail.yanxuan.change.integration.email.email.SupplierEmailResponseResult;
import com.netease.mail.yanxuan.change.integration.email.email.SupplierEmailSendReq;
public interface ISupplierEmailService {
SupplierEmailResponseResult sendSupplierEmail(SupplierEmailSendReq req);
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.integration.email.service;
import java.io.File;
import java.util.Collection;
import java.util.List;
public interface IUasEhcClient {
/**
* 邮件发送
*
* @param subject
* @param content
* @param toList
* @param ccList
* @param fileList
*/
void sendEmail(String subject, String content, Collection<String> toList, Collection<String> ccList,
List<File> fileList);
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.integration.email.service.impl;
import com.netease.mail.yanxuan.change.integration.email.email.EmailFactor;
import com.netease.mail.yanxuan.change.integration.email.service.IEmailService;
import com.netease.mail.yanxuan.change.integration.email.enums.EmailParamEnum;
import com.netease.mail.yanxuan.change.integration.email.enums.EmailTemplateEnum;
import com.netease.mail.yanxuan.change.common.util.RequestUtil;
import com.netease.mail.yanxuan.qc.service.client.remote.UasClient;
import com.netease.mail.yanxuan.qc.service.client.utils.http.HttpClientTemplate;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class EmailServiceImpl implements IEmailService {
@Autowired
private UasClient uasClient;
@Autowired
private EmailTemplateServiceImpl emailTemplateService;
@Autowired
private HttpClientTemplate httpClientTemplate;
@PostConstruct
private void init() {
httpClientTemplate.init();
httpClientTemplate.setDefaultCharset(RequestUtil.CHAR_SET);
}
@Override
@Async("asyncEmail")
public void sendEmail(String to, EmailFactor emailFactor) {
this.sendEmail(to, null, emailFactor, null);
}
@Override
@Async("asyncEmail")
public void sendEmail(Collection<String> toList, EmailFactor factor) {
this.sendEmail(toList, null, factor, null);
}
@Override
@Async("asyncEmail")
public void sendEmail(String toList, String ccList, EmailFactor factor, List<File> fileList) {
List<String> _toList = null;
List<String> _ccList = null;
if (StringUtils.isNotBlank(toList)) {
_toList = Arrays.asList(toList.split(","));
}
if (StringUtils.isNotBlank(ccList)) {
_ccList = Arrays.asList(ccList.split(","));
}
this.sendEmail(_toList, _ccList, factor, fileList);
}
@Override
@Async("asyncEmail")
public void sendEmail(Collection<String> toList, Collection<String> ccList,
EmailFactor factor) {
if (factor != null) {
String content = this.content(factor);
if (!CollectionUtils.isEmpty(toList)) {
toList = toList.stream().filter(e -> e != null).collect(Collectors.toList());
}
if (!CollectionUtils.isEmpty(ccList)) {
ccList = ccList.stream().filter(e -> e != null).collect(Collectors.toList());
}
this.uasClient.sendEmail(factor.getSubject(), content, toList, ccList, null);
}
}
@Override
@Async("asyncEmail")
public void sendEmail(Collection<String> toList, Collection<String> ccList, EmailFactor factor,
List<File> fileList) {
if (factor != null) {
String content = this.content(factor);
String abnormalTitle = (String) factor.getData().get("abnormalTitle");
String taskType = (String) factor.getData().get(EmailParamEnum.TASK_TYPE.getKey());
String subject = factor.getSubject();
if (!StringUtils.isEmpty(abnormalTitle)) {
subject = String.format(subject, abnormalTitle, taskType);
}
if (!StringUtils.isEmpty(taskType)) {
subject = String.format(subject, taskType);
}
if (!CollectionUtils.isEmpty(toList)) {
toList = toList.stream().filter(e -> e != null).collect(Collectors.toList());
}
if (!CollectionUtils.isEmpty(ccList)) {
ccList = ccList.stream().filter(e -> e != null).collect(Collectors.toList());
}
this.uasClient.sendEmail(subject, content, toList, ccList, fileList);
}
}
/**
* 根据邮件模版获取邮件内容
*
* @param emailFactor
* @return
*/
public String content(EmailFactor emailFactor) {
EmailTemplateEnum emailTemplateEnum = emailFactor.getEmailTemplateEnum();
return emailTemplateService.template(emailTemplateEnum.getCode(), emailFactor.getData(),
emailFactor.getType());
}
}
package com.netease.mail.yanxuan.change.integration.email.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.netease.mail.yanxuan.change.integration.email.conig.RpcTemplate;
import com.netease.mail.yanxuan.change.integration.email.email.EmailTemplateResponResult;
import com.netease.mail.yanxuan.change.integration.email.email.EmailTemplateRpcResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Service
public class EmailTemplateServiceImpl {
private static final String TEST_URL = "http://127.0.0.1:8550/proxy/test.yanxuan-template.service.mailsaas/templates/flowx/template/assemble.json";
private static final String ONELINE_URL = "http://127.0.0.1:8550/proxy/online.yanxuan-template.service.mailsaas/templates/flowx/template/assemble.json";
@Value("${rpc.url.email.template}")
private String url;
@Autowired
private RpcTemplate rpcTemplate;
public String template(String templateCode, Object mockData, String type) {
Map<String, Object> params = new HashMap<>();
params.put("mockData", mockData);
params.put("templateCode", templateCode);
params.put("type", type);
EmailTemplateResponResult emailTemplateResponResult = rpcTemplate.postJson(url, new JSONObject(params).toJSONString(), 500, new EmailTemplateRpcResult<>(EmailTemplateResponResult.class));
return emailTemplateResponResult.getData();
}
}
package com.netease.mail.yanxuan.change.integration.email.service.impl;
import java.io.File;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.netease.mail.yanxuan.change.common.bean.ResponseCode;
import com.netease.mail.yanxuan.change.integration.email.service.IUasEhcClient;
import org.apache.commons.lang.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.util.CollectionUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.netease.mail.yanxuan.qc.service.client.utils.http.HttpClientExecutor;
import com.netease.yanxuan.sc.guard.lib.meta.enums.guard.Type;
@Service
public class IUasClientEhcImpl implements IUasEhcClient {
private static final String PUSH_EMAIL = "/push/email/yanxuan-sc-ehc";
public static final String CODE = "code";
private Logger logger = LoggerFactory.getLogger(EmailEhcServiceImpl.class);
@Autowired
private HttpClientExecutor httpClientExecutor;
@Value("${rpc.url.uas.basic}")
private String uasUrl;
@Override
public void sendEmail(String subject, String content, Collection<String> toList, Collection<String> ccList,
List<File> fileList) {
if (!CollectionUtils.isEmpty(toList)) {
String url = uasUrl + PUSH_EMAIL;
Map<String, String> params = new HashMap();
params.put("subject", subject);
params.put("content", content);
if (!CollectionUtils.isEmpty(toList)) {
params.put("to", StringUtils.join(toList, ","));
}
params.put("topic", "ehc");
if (!CollectionUtils.isEmpty(ccList)) {
params.put("cc", StringUtils.join(ccList, ","));
}
String res = null;
try {
res = this.httpClientExecutor.doPost(url, params);
} catch (Exception e) {
logger.error("[sendEmail] params={}, e={}", JSON.toJSONString(params), e);
}
this.logger.info("[sendEmail] toList={}, ccList={}, params={}, res={} ", JSON.toJSONString(toList),
JSON.toJSONString(ccList), JSON.toJSONString(params), JSON.toJSONString(res));
JSONObject jsonObject = JSON.parseObject(res);
if (jsonObject.getInteger(CODE) != ResponseCode.SUCCESS.getCode()) {
this.logger.error(Type.RPC.toString(), "SendEmail", null,
"send email failed, subject={},toList={},ccList={}",
new Object[] { subject, JSON.toJSONString(toList), JSON.toJSONString(ccList) });
}
}
}
}
package com.netease.mail.yanxuan.change.integration.email.service.impl;
import com.alibaba.fastjson.JSON;
import com.netease.mail.yanxuan.change.integration.email.conig.RpcTemplate;
import com.netease.mail.yanxuan.change.integration.email.email.RpcObjectHandler;
import com.netease.mail.yanxuan.change.integration.email.email.SupplierEmailResponseResult;
import com.netease.mail.yanxuan.change.integration.email.email.SupplierEmailSendReq;
import com.netease.mail.yanxuan.change.integration.email.service.ISupplierEmailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Value;
@Service
public class SupplierEmailServiceImpl implements ISupplierEmailService {
private Logger logger = LoggerFactory.getLogger(SupplierEmailServiceImpl.class);
@Autowired
private RpcTemplate rpcTemplate;
@Value("${rpc.url.supplier.purchase}")
private String emailUrl;
/**
* 接口
*/
private static final String SUPPLIER_EMAIL_SEND = "/api/supplier/msg/sendMail.json";
@Override
public SupplierEmailResponseResult sendSupplierEmail(SupplierEmailSendReq req) {
logger.info("[sendSupplierEmail] req:{}", JSON.toJSONString(req));
SupplierEmailResponseResult responseResult = null;
try {
responseResult = rpcTemplate.postJson(emailUrl+SUPPLIER_EMAIL_SEND,
JSON.toJSONString(req),500, new RpcObjectHandler<>(SupplierEmailResponseResult.class));
}catch (Exception e) {
logger.error("[sendSupplierEmail] 供应商邮件发送失败 e:{}",e.getMessage());
}
if (responseResult == null) {
return null;
}
return responseResult;
}
}
package com.netease.mail.yanxuan.change.integration.email.util;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
/**
* @author lwtang
* @date 2019-02-19
*/
public class EncodeUtil {
private static final char[] CHARS = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'a', 'b', 'c', 'd', 'e', 'f' };
public static String encode(String text) {
try {
return URLEncoder.encode(text, "UTF-8");
} catch (Exception e) {
return text;
}
}
public static String encodeMap(Map<?, ?> map) {
List<String> lines = new ArrayList<>();
for (Map.Entry<?, ?> entry: map.entrySet()) {
lines.add(String.valueOf(entry.getKey()) + "=" + String.valueOf(entry.getValue()));
}
return StringUtils.join(lines, "&");
}
public static String decode(String text) {
try {
return URLDecoder.decode(text, "UTF-8");
} catch (Exception e) {
return text;
}
}
public static String ASCIIHex(String text) {
byte[] bytes = text.getBytes();
char[] chars = new char[bytes.length * 2];
for (int i = 0; i < bytes.length; i++) {
chars[2 * i] = CHARS[bytes[i] >> 4];
chars[2 * i + 1] = CHARS[bytes[i] % 16];
}
return new String(chars).toUpperCase();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment