经过网络查找的解答就是为了单例。
枚举类可以实现接口,但要求枚举中的每个对象都必须覆写接口中的方法。
枚举类中可以定义抽象方法,但要求枚举中的每个对象都必须覆写方法。
以下是示例:
public interface CustomerPushService {
/**
* 获取需要推送的用户ID集合
* @param custId
* @return
*/
Set<Integer> getPushUserArchiveIds(Integer custId,Integer cityId,Integer compId);
}
public enum CustomerPushServiceEnum implements CustomerPushService {
/**
* 发起报备
**/
START_REPORT(Const.ML_FUN_CUST_TRACK_0, Const.ML_FUN_CUST_PUSH_TITLE_0, Const.ML_FUN_CUST_PUSH_SUBJECT_CONTENT_0) {
@Override
public Set<Integer> getPushUserArchiveIds(Integer custId, Integer cityId, Integer compId) {
// 发起报备只需要发送给驻场 项目负责人以及权限人
return getManageReceiverUserIds(custId, cityId, compId);
}
},
CANCEL_REPORT(Const.ML_FUN_CUST_TRACK_9, Const.ML_FUN_CUST_PUSH_TITLE_9, Const.ML_FUN_CUST_PUSH_SUBJECT_CONTENT_9) {
@Override
public Set<Integer> getPushUserArchiveIds(Integer custId, Integer cityId, Integer compId) {
/**
* 取消报备 发送给报备人
*/
return getManageReceiverUserIds(custId, cityId, compId);
}
},
REJECT_REPORT(Const.ML_FUN_CUST_TRACK_10, Const.ML_FUN_CUST_PUSH_TITLE_10, Const.ML_FUN_CUST_PUSH_SUBJECT_CONTENT_10) {
@Override
public Set<Integer> getPushUserArchiveIds(Integer custId, Integer cityId, Integer compId) {
/**
* 驳回报备 发送给报备人
*/
return getReporterUserId(custId);
}
},
CONFIRM_REPORT(Const.ML_FUN_CUST_TRACK_1, Const.ML_FUN_CUST_PUSH_TITLE_1, Const.ML_FUN_CUST_PUSH_SUBJECT_CONTENT_1) {
@Override
public Set<Integer> getPushUserArchiveIds(Integer custId, Integer cityId, Integer compId) {
/**
* 确认报备 发送给报备人
*/
return getReporterUserId(custId);
}
},
ARRIVAL(Const.ML_FUN_CUST_TRACK_2, Const.ML_FUN_CUST_PUSH_TITLE_2, Const.ML_FUN_CUST_PUSH_SUBJECT_CONTENT_2) {
@Override
public Set<Integer> getPushUserArchiveIds(Integer custId, Integer cityId, Integer compId) {
/**
* 到场 发送给报备人
*/
return getReporterUserId(custId);
}
},
VISIT(Const.ML_FUN_CUST_TRACK_3, Const.ML_FUN_CUST_PUSH_TITLE_3, Const.ML_FUN_CUST_PUSH_SUBJECT_CONTENT_3) {
@Override
public Set<Integer> getPushUserArchiveIds(Integer custId, Integer cityId, Integer compId) {
/**
* 复访 发送给报备人
*/
return getReporterUserId(custId);
}
},
MAKE_DEAL(Const.ML_FUN_CUST_TRACK_5, Const.ML_FUN_CUST_PUSH_TITLE_5, Const.ML_FUN_CUST_PUSH_SUBJECT_CONTENT_5) {
@Override
public Set<Integer> getPushUserArchiveIds(Integer custId, Integer cityId, Integer compId) {
/**
* 认购 发送给报备人 以及相关责任人
*/
Set<Integer> ids = getReporterUserId(custId);
ids.addAll(getManageReceiverUserIds(custId, cityId, compId));
return ids;
}
},
CANCEL_DEAL(Const.ML_FUN_CUST_TRACK_11, Const.ML_FUN_CUST_PUSH_TITLE_11, Const.ML_FUN_CUST_PUSH_SUBJECT_CONTENT_11) {
@Override
public Set<Integer> getPushUserArchiveIds(Integer custId, Integer cityId, Integer compId) {
/**
* 取消认购 发送给报备人 以及相关责任人
*/
Set<Integer> ids = getReporterUserId(custId);
ids.addAll(getManageReceiverUserIds(custId, cityId, compId));
return ids;
}
},
PROMOTION_EXPIRE(Const.ML_FUN_CUST_TRACK_12, Const.ML_FUN_CUST_PUSH_TITLE_12, Const.ML_FUN_CUST_PUSH_SUBJECT_CONTENT_12) {
@Override
public Set<Integer> getPushUserArchiveIds(Integer custId, Integer cityId, Integer compId) {
/**
* 超过项目推广期 发送给报备人 以及相关责任人
*/
Set<Integer> ids = getReporterUserId(custId);
ids.addAll(getManageReceiverUserIds(custId, cityId, compId));
return ids;
}
},
REPORT_VALIDITY_EXPIRE(Const.ML_FUN_CUST_TRACK_13, Const.ML_FUN_CUST_PUSH_TITLE_12, Const.ML_FUN_CUST_PUSH_SUBJECT_CONTENT_13) {
@Override
public Set<Integer> getPushUserArchiveIds(Integer custId, Integer cityId, Integer compId) {
/**
* 超过报备有效期 发送给报备人 以及相关责任人
*/
Set<Integer> ids = getReporterUserId(custId);
ids.addAll(getManageReceiverUserIds(custId, cityId, compId));
return ids;
}
},
CONFIRM_REPORT_VALIDITY_EXPIRE(Const.ML_FUN_CUST_TRACK_14, Const.ML_FUN_CUST_PUSH_TITLE_12, Const.ML_FUN_CUST_PUSH_SUBJECT_CONTENT_14) {
@Override
public Set<Integer> getPushUserArchiveIds(Integer custId, Integer cityId, Integer compId) {
/**
* 超过报备确认有效期 发送给报备人 以及相关责任人
*/
Set<Integer> ids = getReporterUserId(custId);
ids.addAll(getManageReceiverUserIds(custId, cityId, compId));
return ids;
}
},
ARRIVAL_PROTECTED_EXPIRE(Const.ML_FUN_CUST_TRACK_15, Const.ML_FUN_CUST_PUSH_TITLE_12, Const.ML_FUN_CUST_PUSH_SUBJECT_CONTENT_15) {
@Override
public Set<Integer> getPushUserArchiveIds(Integer custId, Integer cityId, Integer compId) {
/**
* 超过到场保护期 发送给报备人 以及相关责任人
*/
Set<Integer> ids = getReporterUserId(custId);
ids.addAll(getManageReceiverUserIds(custId, cityId, compId));
return ids;
}
},
DEFAULT(Const.ML_FUN_CUST_TRACK_0, Const.ML_FUN_CUST_PUSH_TITLE_0, Const.ML_FUN_CUST_PUSH_SUBJECT_CONTENT_0) {
@Override
public Set<Integer> getPushUserArchiveIds(Integer custId, Integer cityId, Integer compId) {
return new HashSet<>();
}
};
protected AgencyFunCustMapper agencyFunCustMapper;
protected AgencyPropertyRelatedPersonMapper agencyPropertyRelatedPersonMapper;
private ErpFunUsersMapper erpFunUsersMapper;
private ErpFunTaskService erpFunTaskService;
private PushBuildWebFeignClient pushBuildWebFeignClient;
protected static final Logger LOG = LoggerFactory.getLogger(CustomerPushServiceEnum.class);
private byte trackType;
private String title;
private String subjectContent;
private Executor taskExecutor;
CustomerPushServiceEnum(byte trackType, String title, String subjectContent) {
this.trackType = trackType;
this.title = title;
this.subjectContent = subjectContent;
}
private byte getTrackType() {
return trackType;
}
private String getSubjectContent() {
return subjectContent;
}
private String getTitle() {
return title;
}
private Integer getTemplateId() {
return 137;
}
public void setAgencyFunCustMapper(AgencyFunCustMapper agencyFunCustMapper) {
this.agencyFunCustMapper = agencyFunCustMapper;
}
public void setAgencyPropertyRelatedPersonMapper(AgencyPropertyRelatedPersonMapper agencyPropertyRelatedPersonMapper) {
this.agencyPropertyRelatedPersonMapper = agencyPropertyRelatedPersonMapper;
}
public void setErpFunUsersMapper(ErpFunUsersMapper erpFunUsersMapper) {
this.erpFunUsersMapper = erpFunUsersMapper;
}
private void setErpFunTaskService(ErpFunTaskService erpFunTaskService) {
this.erpFunTaskService = erpFunTaskService;
}
public void setPushBuildWebFeignClient(PushBuildWebFeignClient pushBuildWebFeignClient){
this.pushBuildWebFeignClient = pushBuildWebFeignClient;
}
public static CustomerPushServiceEnum getServiceByTrackType(byte trackType) {
for (CustomerPushServiceEnum pushService : CustomerPushServiceEnum.values()) {
if (pushService.getTrackType() == trackType) {
return pushService;
}
}
return DEFAULT;
}
public void pushMsg(Integer custId, byte custStatus, String isShare, BrokerOperator operator) {
taskExecutor.execute(new Runnable() {
@Override
public void run() {
try {
/** 遍历需要发送的用户 **/
getPushUserArchiveIds(custId, operator.getCityId(), operator.getCompId()).stream().forEach(var -> {
ErpFunUsers user = erpFunUsersMapper.selectByUserId(operator.getCityId(), var);
if (user != null) {
String content = getPushSubjectContent(custId);
ErpFunTask erpFunTask = new ErpFunTask();
erpFunTask.setCaseType((byte) 0);
erpFunTask.setCaseId(0);
erpFunTask.setShardCityId(operator.getCityId());
erpFunTask.setTrackType(Const.DIC_TASK_TYPE_BAOBEI);
erpFunTask.setTaskType(Const.DIC_TASK_TYPE_BAOBEI);
erpFunTask.setTaskSubject(content);
erpFunTask.setTaskDesc(content);
erpFunTask.setCompId(operator.getCompId());
erpFunTask.setTypeFlag(Const.DIC_TASK_TYPE_FLAG_0);
erpFunTask.setIsRead(false);
erpFunTask.setTaskStatus(Const.DIC_TASK_STATUS_NEW);
erpFunTask.setCreatorUid(operator.getUserId());//发送人
erpFunTask.setCreationTime(DateTimeHelper.formatDateTimetoString(new Date()));
erpFunTask.setDeptId(operator.getDeptId());
erpFunTask.setTrackWarm(true);
erpFunTask.setTaskOwner(var);//收信人
erpFunTask.setWarmTime(DateUtil.DateToString(new Date()));
erpFunTaskService.insertTask(operator.getCityId(), erpFunTask);
execPushMsg(getTemplateId(), user.getArchiveId(), getTitle(), content, custId, custStatus, isShare);
}
});
} catch (Exception e) {
e.printStackTrace();
LOG.error("pushMsgForSystem error , customer id is " + custId);
}
}
});
}
public void pushMsgForSystem(AgencyFunCust funCust) {
try {
/** 遍历需要发送的用户 **/
getPushUserArchiveIds(funCust.getCustId(), funCust.getCityId().intValue(), funCust.getCompId()).stream().forEach(var -> {
ErpFunUsers user = erpFunUsersMapper.selectByUserId(funCust.getCityId().intValue(), var);
if (user != null) {
String content = getPushSubjectContent(funCust.getCustId());
ErpFunTask erpFunTask = new ErpFunTask();
erpFunTask.setCaseType((byte) 0);
erpFunTask.setCaseId(0);
erpFunTask.setShardCityId(funCust.getCityId().intValue());
erpFunTask.setTrackType(Const.DIC_TASK_TYPE_BAOBEI);
erpFunTask.setTaskType(Const.DIC_TASK_TYPE_BAOBEI);
erpFunTask.setTaskSubject(content);
erpFunTask.setTaskDesc(content);
erpFunTask.setCompId(funCust.getCompId());
erpFunTask.setTypeFlag(Const.DIC_TASK_TYPE_FLAG_0);
erpFunTask.setIsRead(false);
erpFunTask.setTaskStatus(Const.DIC_TASK_STATUS_NEW);
erpFunTask.setCreatorUid(Const.SYSTEM_UID);//发送人
erpFunTask.setCreationTime(DateTimeHelper.formatDateTimetoString(new Date()));
erpFunTask.setDeptId(funCust.getDeptId());
erpFunTask.setTrackWarm(true);
erpFunTask.setTaskOwner(var);//收信人
erpFunTask.setDeptId(0);
erpFunTask.setWarmTime(DateUtil.DateToString(new Date()));
erpFunTaskService.insertTask(funCust.getCityId().intValue(), erpFunTask);
execPushMsg(getTemplateId(), user.getArchiveId(), getTitle(), content, funCust.getCustId(), Const.ML_FUN_CUST_STATUS_0, StrUtil.EMPTY);
}
});
} catch (Exception e) {
e.printStackTrace();
LOG.error("pushMsgForSystem error , customer id is " + funCust.getCustId());
}
}
private void execPushMsg(Integer templateId, Integer receiver, String title, String content, Integer custId, int status, String isShare) {
JSONObject pushParam = new JSONObject();
pushParam.put("templateId", templateId);
pushParam.put("receiver", receiver);
// 通知标题
pushParam.put("title", title);
pushParam.put("content", content);
//类别 同城报备“” 跨城报备“3”
pushParam.put("projectType", isShare);
//当前客户状态 客户状态 -3 取消认购 -2 报备驳回 -1 报备取消 0 数据失效 1报备中 2已确认 3已到场 4已复访 5已认购
pushParam.put("status", status);
pushParam.put("custId", custId);
String iosRouterUrl = "zshft://router.method?targetclass=FXBuildTargetAction&methodkey=mlCustomerDetailVcWithPara:&custId=%s&isShare=%s";
iosRouterUrl = String.format(iosRouterUrl, custId, Objects.equals("3", isShare) ? 1 : 0);
// 苹果跳转地址
pushParam.put("ios_router_url", iosRouterUrl);
Map<String, Object> paramExt = new HashMap<String, Object>();
paramExt.put("paramExt", pushParam.toJSONString());
String respResult = null;
try{
respResult = HttpUtil.postJson(AppConfig.getProperty("common.pushWeb.path") + "openApi/push/pushMsg", paramExt);
LOG.info("----------------->>请求pushWeb 的url:{},参数:{}", AppConfig.getProperty("common.pushWeb.path") + "openApi/push/pushMsg", paramExt);
LOG.info("----------------->>请求pushWeb结果:{}", respResult);
}catch(Exception ex){
LOG.error(" push mag erro. HttpUtil.postJson" + ex.toString());
}
if(respResult == null || !respResult.contains("200")){
LOG.info("----------------->>请求pushWebFeignClient start......}");
PushMsgParam extParam = new PushMsgParam();
extParam.setParamExt(pushParam.toJSONString());
try{
pushBuildWebFeignClient.pushMsg(extParam);
LOG.info("----------------->>请求pushWebFeignClient结果:{}", respResult);
}catch(Exception ex){
LOG.error("pushBuildWebFeignClient push mag erro." + ex.toString());
}
}
}
protected Set<Integer> getManageReceiverUserIds(Integer custId, Integer cityId, Integer compId) {
Set<Integer> receiverIds = new HashSet<>();
/**
* 发起报备需要发送信息的人员 ID
* 驻场经理
* 项目负责人
* 权限人
*/
AgencyFunCust funCust = agencyFunCustMapper.selectByOnlyCustId(custId);
if (funCust.getSaleUid() == null) {
/**
* 当获取的指定驻场经理人员为空时 就系统提醒该项目合同期内所有驻场人员
*/
List<AgencyPropertyRelatedPerson> propertyRelatedPersonList = agencyPropertyRelatedPersonMapper.selectByBuildIdAndPersonType(funCust.getBuildId(), 2, null);
if (propertyRelatedPersonList.isEmpty()) {
return receiverIds;
}
List<Integer> userIds = propertyRelatedPersonList.stream().map(AgencyPropertyRelatedPerson::getUserId).distinct().collect(Collectors.toList());
receiverIds.addAll(userIds);
} else {
// 过滤掉不在有效期内的驻场人员
List<AgencyPropertyRelatedPerson> propertyRelatedPersonList = agencyPropertyRelatedPersonMapper.selectByBuildIdAndPersonType(funCust.getBuildId(), 2, funCust.getSaleUid());
if (!propertyRelatedPersonList.isEmpty()) {
propertyRelatedPersonList.stream().forEach(var -> {
receiverIds.add(var.getUserId());
});
}
}
/** 项目负责人 **/
List<AgencyPropertyRelatedPerson> personList = agencyPropertyRelatedPersonMapper.selectByBuildIdAndPersonType(funCust.getBuildId(), 1, null);
List<Integer> buildUserIdList = Optional.ofNullable(personList).orElseGet(() -> new ArrayList<>()).parallelStream()
.filter(p -> Objects.nonNull(p.getUserId())).map(AgencyPropertyRelatedPerson::getUserId).distinct().collect(Collectors.toList());
receiverIds.addAll(buildUserIdList);
return receiverIds;
}
protected Set<Integer> getReporterUserId(Integer custId) {
AgencyFunCust funCust = agencyFunCustMapper.selectByOnlyCustId(custId);
Set<Integer> set = new HashSet<>(1);
set.add(funCust.getUserId() == null ? 0 : funCust.getUserId());
return set;
}
private String getPushSubjectContent(Integer custId) {
AgencyFunCust funCust = agencyFunCustMapper.selectByOnlyCustId(custId);
String phone = "";
if (StringUtils.isNotBlank(funCust.getCustMobile())) {
if (funCust.getCustMobile().length() > 8) {
phone = funCust.getCustMobile().substring(0, 3) + "****" + funCust.getCustMobile().substring(7);
} else {
phone = "***";
}
} else {
phone = "空";
}
return String.format(getSubjectContent(), funCust.getBuildName(), funCust.getCustName(), phone) + DateUtil.DateToString(new Date(), "yyyy-MM-dd HH:mm:ss");
}
@Component
public static class ReportTypeServiceInjector {
@Autowired
protected AgencyFunCustMapper agencyFunCustMapper;
@Autowired
protected AgencyPropertyRelatedPersonMapper agencyPropertyRelatedPersonMapper;
@Autowired
private ErpFunUsersMapper erpFunUsersMapper;
@Autowired
private ErpFunTaskService erpFunTaskService;
@Autowired
private Executor taskExecutor;
@Autowired
private PushBuildWebFeignClient pushBuildWebFeignClient;
@PostConstruct
public void postConstruct() {
for (CustomerPushServiceEnum tempEnum : EnumSet.allOf(CustomerPushServiceEnum.class)) {
tempEnum.setAgencyFunCustMapper(agencyFunCustMapper);
tempEnum.setAgencyPropertyRelatedPersonMapper(agencyPropertyRelatedPersonMapper);
tempEnum.setErpFunUsersMapper(erpFunUsersMapper);
tempEnum.setErpFunTaskService(erpFunTaskService);
tempEnum.setTaskExecutor(taskExecutor);
tempEnum.setPushBuildWebFeignClient(pushBuildWebFeignClient);
}
}
}
private void setTaskExecutor(Executor taskExecutor) {
this.taskExecutor = taskExecutor;
}
}