极光推送应用

package com.buss.loan.push.service;

import java.util.Calendar;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import org.jeecgframework.core.util.DateUtils;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import com.buss.loan.push.constant.PushEnum;
import com.buss.loan.push.vo.JpushVo;
import com.buss.loan.push.vo.UserInfo;
import com.google.common.base.Strings;
import com.google.common.collect.Maps;

import cn.jpush.api.JPushClient;
import cn.jpush.api.common.resp.APIConnectionException;
import cn.jpush.api.common.resp.APIRequestException;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.PushPayload;

@Service("jPushService")
public class JPushService extends AbstractJPushService{
Logger logger = Logger.getLogger(JPushService.class);


public void push(PushEnum pushEnum,String piId,UserInfo userInfo) {
try {
JpushVo jpushVo = packageVo(pushEnum, piId,userInfo);
if (CollectionUtils.isNotEmpty(userInfo.getRegistrationIds())){
logger.info("jpush info:"+JSON.toJSONString(jpushVo));
PushPayload payload = buildPushAndroidOrIOSMessageWithExtras(jpushVo);
PushResult result = new JPushClient(getMasterSecret(), getAppKey()).sendPush(payload);
logger.info("jpush 成功返回响应信息"+result);
}else{
if (!Strings.isNullOrEmpty(piId)){
logger.info(failLoggerInfo(piId));
}
}
} catch (APIConnectionException e) {
logger.error("Connection error, should retry later"+e.getMessage(), e);
} catch (APIRequestException e) {
logger.error("Should review the error, and fix the request"+e.getMessage(), e);
logger.info("HTTP Status: " + e.getStatus());
logger.info("Error Code: " + e.getErrorCode());
logger.info("Error Message: " + e.getErrorMessage());
}
}

/**
* 数据封装到VO
* @param paramList
* @param type
* @param afferentType
* @param amount
*/
private JpushVo packageVo(PushEnum pushEnum,String piId,UserInfo userInfo){
JpushVo jpushVo = new JpushVo();
jpushVo.setRegistrationIds(userInfo.getRegistrationIds());
jpushVo.setAlert(getAlert(pushEnum, piId,userInfo));

Map<String,String> extras = Maps.newHashMap();
extras.put("type", pushEnum.getValue().toString());
extras.put("type_name",getTypeName(pushEnum));
extras.put("date",DateUtils.datetimeFormat.format(Calendar.getInstance().getTime()));
extras.put("message",jpushVo.getAlert());
jpushVo.setExtrasVo(extras);
return jpushVo;
}

public static JPushService getInstance(){
return SingletonHolder.instance;
}

}

package com.buss.loan.push.service;

import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.jeecgframework.core.util.ApplicationContextUtil;
import org.springframework.core.io.support.PropertiesLoaderUtils;

import com.buss.loan.message.entity.VTaskUser;
import com.buss.loan.push.constant.PushEnum;
import com.buss.loan.push.vo.JpushVo;
import com.buss.loan.push.vo.UserInfo;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Collections2;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;

import cn.jpush.api.push.model.Message;
import cn.jpush.api.push.model.Options;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;

public abstract class AbstractJPushService {

private static String messageSwitch;
private static String jpushSwitch;
private static String appKey;
private static String masterSecret;
private static Boolean apns;

protected static Map<String,String> afferentMap = null;
protected static Map<String,String> extrasMap = null;


static{
afferentMap = Maps.newHashMap();
MapUtils.putAll(afferentMap, new Object[]{
PushEnum.PUSH.getValue(),"您有新的待认领任务,流水号:XXX。请及时登录系统并办理任务哦,么么哒",
PushEnum.DAYPUSH.getValue(),"您有今日到期的月缴费,合同号如下:[ AAA ]。请及时登录系统并办理任务哦,么么哒",
PushEnum.FIVEDAYPUSH.getValue(),"5 日后到期的月缴费,合同号如下:[ AAA ]。请及时登录系统并办理任务哦,么么哒",
PushEnum.OVERDUEDAY.getValue(),"您有逾期的还款计划,合同号如下:[ AAA ]。请及时登录系统并办理任务哦,么么哒",
PushEnum.PAYMENTCHANGE.getValue(),"首创还款计划变更通知,合同号如下:[ AAA ],金额如下:[ BBB ]。",
PushEnum.USERREPPLAN.getValue(),"首创用户还款通知,合同号:[ AAA ],还款期数:[ BBB ],已还本金:[ CCC ],已还利息:[ DDD ]。",
PushEnum.GUARANTEECOMPENSATION.getValue(),"担保代偿通知,合同号:[ AAA ],融资人id:[ BBB ],担保人id:[ CCC ]。",
PushEnum.PREPAYMENT.getValue(),"提前还款申请通知,合同号:[ AAA ],订单id:[ BBB ],原还款日期:[ CCC ],新还款日期:[ DDD ],应还利息:[ EEE ]",
PushEnum.USERREPPLANAPP.getValue(),"首创用户还款通知,合同号:[ AAA ],还款期数:[ BBB ],已还本金:[ CCC ],已还利息:[ DDD ]。"
});

extrasMap = Maps.newHashMap();
MapUtils.putAll(extrasMap, new Object[]{
PushEnum.PUSH.getValue(), "流程待领任务",
PushEnum.DAYPUSH.getValue(),"今日到期的月缴费",
PushEnum.FIVEDAYPUSH.getValue(),"5 日后到期的月缴费",
PushEnum.OVERDUEDAY.getValue(),"逾期的还款计划",
PushEnum.PAYMENTCHANGE.getValue(),"首创还款计划变更通知",
PushEnum.USERREPPLAN.getValue(),"首创用户还款通知",
PushEnum.GUARANTEECOMPENSATION.getValue(),"担保代偿通知",
PushEnum.PREPAYMENT.getValue(),"提前还款申请通知",
PushEnum.USERREPPLANAPP.getValue(),"用户还款申请通知"
});

try{
Properties p = PropertiesLoaderUtils.loadAllProperties("sysConfig.properties");
appKey = p.getProperty("jpush.appKey");
masterSecret = p.getProperty("jpush.masterSecret");
messageSwitch = p.getProperty("message_switch");
jpushSwitch = p.getProperty("jpush_switch");
apns = Boolean.valueOf(p.getProperty("apns"));
}catch(Exception e){
e.printStackTrace();
}

}

    /**
* 获取不同的标题
* @param pushEnum
* @return
*/
    protected String getTypeName(PushEnum pushEnum) {
StringBuilder typeName = new StringBuilder();
switch (pushEnum) {
case PUSH: case DAYPUSH: case FIVEDAYPUSH: case OVERDUEDAY:  case PAYMENTCHANGE: case USERREPPLAN: case GUARANTEECOMPENSATION: case PREPAYMENT: case USERREPPLANAPP:
typeName.append(extrasMap.get(pushEnum.getValue()));
break;
default:
break;
}
return typeName.toString();
}

/**
* 获取不同的内容
* @param pushEnum
* @param piId
* @param userInfo
* @return
*/
    protected String getAlert(PushEnum pushEnum, String piId,UserInfo userInfo) {
StringBuilder alert = new StringBuilder();
String tempAlert = afferentMap.get(pushEnum.getValue());
switch (pushEnum) {
case PUSH:
alert.append(StringUtils.replace(tempAlert, "XXX", piId.toString()));
break;
case DAYPUSH: case FIVEDAYPUSH: case OVERDUEDAY:
alert.append(StringUtils.replace(tempAlert, "XXX", userInfo.getContractSns()));
break;
case PAYMENTCHANGE:
tempAlert = StringUtils.replaceEach(tempAlert, new String[]{"AAA","BBB"},
new String[]{userInfo.getContractSn(),userInfo.getAmount()});
alert.append(tempAlert);
break;
case USERREPPLAN:  case USERREPPLANAPP:
tempAlert = StringUtils.replaceEach(tempAlert, new String[]{"AAA","BBB","CCC","DDD"},
new String[]{userInfo.getContractSn(),userInfo.getPeriods()
,userInfo.getPaidPrincipal(), userInfo.getPaidInterest()});
alert.append(tempAlert);
break;
case GUARANTEECOMPENSATION:
tempAlert = StringUtils.replaceEach(tempAlert, new String[]{"AAA","BBB","CCC"},
new String[]{userInfo.getContractSn(),userInfo.getFinancierId(),
userInfo.getGuaranteeId()});
alert.append(tempAlert);
case PREPAYMENT:
tempAlert = StringUtils.replaceEach(tempAlert, new String[]{"AAA","BBB","CCC","DDD","EEE"},
new String[]{userInfo.getContractSn(),userInfo.getOrderId()
,userInfo.getOldRepayDate(), userInfo.getNewRepayDate(), userInfo.getRepaymentAmount()});
alert.append(tempAlert);
default:
break;
}
return alert.toString();
}

    /**
     * 推送桩极光信息
     * @return
     */
    public PushPayload buildPushAndroidOrIOSMessageWithExtras(JpushVo jpushVo) {
return PushPayload.newBuilder()
                .setPlatform(Platform.android_ios())
                .setAudience(Audience.registrationId(jpushVo.getRegistrationIds()))
                .setNotification(Notification.newBuilder()
                        .addPlatformNotification(IosNotification.newBuilder()
                                .setAlert(jpushVo.getAlert())
                                .setBadge(0)
                                .addExtras(jpushVo.getExtrasVo())
                                .build())
                        .addPlatformNotification(AndroidNotification.newBuilder()
                        .setAlert(jpushVo.getAlert())
                        .addExtras(jpushVo.getExtrasVo())
                        .build())
                        .build())
                 .setOptions(Options.newBuilder()
                         .setApnsProduction(getApns())
                         .setTimeToLive(86400)
                         .build())
                 .setMessage(Message.newBuilder()
                .setMsgContent(jpushVo.getAlert())
                .setContentType("text")
                .setTitle(null)
                .addExtras(jpushVo.getExtrasVo())
                .build())
                 .build();
    }
   
    /**
     * 如果此节点未注册则输出信息
     * @param piId
     * @return
     */
protected String failLoggerInfo(String piId) {
TaskService taskService = ApplicationContextUtil.getContext().getBean("taskService", TaskService.class);
Task task = taskService.createTaskQuery().processInstanceId(piId).singleResult();
String name = task.getName();
StringBuilder message = new StringBuilder();
message.append("流程节点 piId:[")
.append(piId)
.append("] 下个节点 [")
.append(name)
.append("] 所有审核人都未注册 设备id");
return message.toString();
}
   
/**
* @author mazg
* @see [延迟加载]
*/
protected static class SingletonHolder{
protected static JPushService instance = new JPushService();
}
    /**
     * 取出所有的设备id
     * @param paramList
     * @return
     */
public List<String> getRegistrationIds(List<VTaskUser> paramList) {
List<String> registrationIds = Lists.transform(paramList,new Function<VTaskUser, String>() {
@Override
public String apply(VTaskUser input) {
return input.getRegistrationId();
}
});
return convertList(registrationIds);
}

/**
* List 去重
* @param registrationIds
* @return
*/
private List<String> convertList(List<String> registrationIds) {
if (CollectionUtils.isNotEmpty(registrationIds)){
Set<String> registrationIdsSet = Sets.filter(new HashSet<>(registrationIds), Predicates.notNull());
return Lists.newArrayList(registrationIdsSet);
}
return null;
}

/**
* 去除重复数据
* @param userInfos
* @return
*/
public static Collection<UserInfo> doDuplicateData(List<UserInfo> userInfos) {
return Collections2.filter(userInfos,new Predicate<UserInfo>(){
@Override
public boolean apply(UserInfo input) {
return Optional.fromNullable(input.getRegistrationId()).isPresent();
}});
}

/**
* 返回满足条件的设备id
* @param userInfo
* @param tempRegistrationIds
* @return
*/
public static List<String> getConditionRegId(final UserInfo userInfo, Collection<UserInfo> tempRegistrationIds) {
List<String> registrationIds = FluentIterable.from(tempRegistrationIds).filter(new Predicate<UserInfo>(){
@Override
public boolean apply(UserInfo input) {
return StringUtils.equals(userInfo.getSysOrgCode(), input.getSysOrgCode());
}}).transform(new Function<UserInfo,String>(){
@Override
public String apply(UserInfo input) {
return input.getRegistrationId();
}}).toList();
return registrationIds;
}

/**
* 返回满足条件的设备id
* @param userInfo
* @param tempRegistrationIds
* @return
*/
public static List<String> getNoConditionRegId(final UserInfo userInfo, Collection<UserInfo> tempRegistrationIds) {
List<String> registrationIds = FluentIterable.from(tempRegistrationIds).
transform(new Function<UserInfo,String>(){
@Override
public String apply(UserInfo input) {
return input.getRegistrationId();
}
}).toList();
return registrationIds;
}

public static String getMessageSwitch() {
return messageSwitch;
}
public static String getJpushSwitch() {
return jpushSwitch;
}
    public static String getAppKey() {
return appKey;
}
public static String getMasterSecret() {
return masterSecret;
}
public static Boolean getApns() {
return apns;
}

public static void main(String[] args) {
String tempAlert = "首创还款计划变更通知,合同号如下:[ AAA ],金额如下:[ BBB ]。";
tempAlert = StringUtils.replaceEach(tempAlert, new String[]{"AAA","BBB"},
new String[]{"11","22"});
System.out.println(tempAlert);
}
}

猜你喜欢

转载自zhigang-online.iteye.com/blog/2333103
今日推荐