package com.ucmed.nbpt.service.push;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONObject;
import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import com.tencent.xinge.Message;
import com.tencent.xinge.MessageIOS;
import com.tencent.xinge.TagTokenPair;
import com.tencent.xinge.XingeApp;
import com.ucmed.common.net.RequestMaker;
import com.ucmed.common.util.DateUtil;
import com.ucmed.nbpt.dataobject.push.PushMessage;
import com.ucmed.nbpt.dataobject.push.SetPush;
import com.ucmed.nbpt.model.UserSessionModel;
import com.ucmed.nbpt.service.UserSessionService;
public class PublicPushProvider {
public static final Logger LOG = Logger.getLogger(PublicPushProvider.class);
private RequestMaker pushRequestMaker;
private PushMessageService pushMessageService;
private SetPushService setPushService;
private UserSessionService userSessionService;
private XingeApp xinGeApp;
private XingeApp xinGeAppIOS;
/**
* 是否测试:0 不是 1:是
*/
private boolean isTest=true;
public void setPushRequestMaker(RequestMaker pushRequestMaker) {
this.pushRequestMaker = pushRequestMaker;
}
public void setIsTest(boolean isTest) {
this.isTest = isTest;
}
public void setSetPushService(SetPushService setPushService) {
this.setPushService = setPushService;
}
public void setPushMessageService(PushMessageService pushMessageService) {
this.pushMessageService = pushMessageService;
}
public void setUserSessionService(UserSessionService userSessionService) {
this.userSessionService = userSessionService;
}
public void setXinGeApp(XingeApp xinGeApp) {
this.xinGeApp = xinGeApp;
}
public void setXinGeAppIOS(XingeApp xinGeAppIOS) {
this.xinGeAppIOS = xinGeAppIOS;
}
/**
* 推送消息
*
* @param model
* @return
*/
public void pushMsg(PushMessage model, String name, String barcode,
String type) {
SetPush push = setPushService.selectByNameAndbarcode(name, type,
barcode);
if (push != null) {
try {
JSONObject p = new JSONObject();
p.put("soft_id", getSoftId(push.getDeviceType()));
p.put("is_test", isTest ? "1" : "0");
p.put("device", push.getDevice());
p.put("alert", model.getContent());
Map<String, String> msg = new HashMap<String, String>();
msg.put("msg_type", model.getType());
msg.put("target_id", model.getTargetId().toString());
msg.put("date", DateUtil.formatDate6(model.getCreateTime()));
if (model.getTmp1() != null)
msg.put("tmp1", model.getTmp1());
if (model.getTmp2() != null)
msg.put("tmp2", model.getTmp2());
if (model.getTmp3() != null)
msg.put("tmp3", model.getTmp3());
if (model.getTmp4() != null)
msg.put("tmp4", model.getTmp4());
p.put("message", msg);
pushRequestMaker.requestActionParams(
"api.push.message.push", p);
} catch (Exception e) {
LOG.error("", e);
}
}
pushMessageService.addPushMessage(model);
}
/**
* 医院通安卓大众版56
* @param userType
* @return
*/
private Object getSoftId(String userType) {
String softId = null;
if ("0".equals(userType)) {//0:Android大众
softId = "56";//原来的推送softId是
} else if ("1".equals(userType)) {
softId = "14";
} else if ("2".equals(userType)) {
softId = "16";
} else if ("3".equals(userType)) {//3:ios大众版
softId = "47";
} else if ("4".equals(userType)) {
softId = "23";
} else if ("5".equals(userType)) {
}
return softId;
}
/**
* 医院通推送
* @param model
*/
public void pushMsgHealth(PushMessage model) {
JSONObject obj = new JSONObject();
//通过用户id 和 用户类型type 1医生2大众 查询出需要推送的用户
List<UserSessionModel> pushList = userSessionService.getUserPush(
model.getAcceptId(), model.getAcceptType());
if (CollectionUtils.isNotEmpty(pushList)) {
for (UserSessionModel push : pushList) {
try {
//通过设备号查询 该用户最后的session
UserSessionModel session = userSessionService.getLastUserSession(push.getDevice());
//该设备号最后登录的用户是当前用户就推送
if(session.getUserId().longValue()==model.getAcceptId().longValue()){
JSONObject p = new JSONObject();
p.put("device", push.getDevice());
//p.put("title", "医院通");
p.put("sound", "default");
p.put("alert", model.getContent());
Map<String, String> msg = new HashMap<String, String>();
msg.put("msg_type", model.getType());
msg.put("target_id", model.getTargetId().toString());
msg.put("date",
DateUtil.formatDate6(model.getCreateTime()));
if (model.getTmp1() != null)
msg.put("tmp1", model.getTmp1());
if (model.getTmp2() != null)
msg.put("tmp2", model.getTmp2());
if (model.getTmp3() != null)
msg.put("tmp3", model.getTmp3());
msg.put("tmp4", "医院通");
msg.put("sound", "default");
p.put("message", msg);
obj = pushRequestMaker.requestActionParams(
"api.push.message.push", p);
model.setRetInfo(obj.optString("return_code","-1"));
}
} catch (Exception e) {
obj.put("return_code", -1);
LOG.error("", e);
}
}
//推送流水
pushMessageService.addPushMessage(model);
}
}
/**
* 信鸽推送
* @param model
*/
@SuppressWarnings("unchecked")
public void pushXinGe(PushMessage model){
JSONObject obj = new JSONObject();
//通过用户id 和 用户类型type 1医生2大众 查询出需要推送的用户
List<UserSessionModel> pushList = userSessionService.getUserPush(
model.getAcceptId(), model.getAcceptType());
if (CollectionUtils.isNotEmpty(pushList)) {
for (UserSessionModel push : pushList) {
try {
//通过设备号查询 该用户最后的session
UserSessionModel session = userSessionService.getLastUserSession(push.getDevice());
//该设备号最后登录的用户是当前用户就推送
if(session.getUserId().longValue()==model.getAcceptId().longValue()){
JSONObject p = new JSONObject();
p.put("alert", model.getContent());
Map<String, String> msg = new HashMap<String, String>();
msg.put("msg_type", model.getType());
msg.put("target_id", model.getTargetId().toString());
msg.put("date",
DateUtil.formatDate6(model.getCreateTime()));
if (model.getTmp1() != null){
msg.put("tmp1", model.getTmp1());
}
if (model.getTmp2() != null){
msg.put("tmp2", model.getTmp2());
}
if (model.getTmp3() != null){
msg.put("tmp3", model.getTmp3());
msg.put("sound", "default");
}
if (model.getContent() != null){
msg.put("content", model.getContent());
}
p.put("message", msg);
// XingeApp xinge = new XingeApp(Constants.XINGE_ANDROID_PATIENT_ACCESSID,
// Constants.XINGE_ANDROID_PATIENT_SECRETKEY);
org.json.JSONObject ret = new org.json.JSONObject();
String deviceType = session.getDeviceType();
//设备号类型 0:Android大众,1:Android医生,2:ios医生版,3:ios大众版,4:win8大众版
if ("0".equals(deviceType)) {
//安卓Message
Message mess = new Message(); // $mess = new MessageIOS();
mess.setType(Message.TYPE_MESSAGE);
mess.setTitle(model.getTmp4());
mess.setContent(model.getContent());
mess.setCustom(JSONObject.fromObject(msg));
ret = xinGeApp.pushSingleAccount(0, push.getDevice(), mess);
model.setRetInfo(ret.optString("ret_code")+","+push.getDevice());
}else if ("3".equals(deviceType)) {
MessageIOS ios = new MessageIOS();
ios.setAlert(model.getTmp4());
ios.setBadge(1);
ios.setSound("beep.wav");
ios.setCustom(JSONObject.fromObject(msg));
//为设备号设置Tag
List<TagTokenPair> pairs = new ArrayList<TagTokenPair>();
pairs.add(new TagTokenPair("tag1",push.getDevice()));
org.json.JSONObject retTag = xinGeAppIOS.BatchSetTag(pairs);
if(0 == retTag.optInt("ret_code")) {
List<String> list = new ArrayList<String>();
list.add("tag1");
ret = xinGeAppIOS.pushTags(0, list, "OR", ios,2);
org.json.JSONObject retDel = xinGeAppIOS.BatchDelTag(pairs);
LOG.info("苹果推送成功删除tag! ret_code:"+retDel);
}
// ret = xinGeAppIOS.pushSingleAccount(0, push.getDevice(), ios, xinGeAppIOS.IOSENV_PROD);
model.setRetInfo(ret.optString("ret_code")+","+push.getDevice());
} else {
LOG.error("device_type 设备号类型传入有误!推送失败");
model.setRetInfo("device_type 设备号类型传入有误!推送失败");
}
}
} catch (Exception e) {
obj.put("return_code", -1);
LOG.error("", e);
}
}
//推送流水
pushMessageService.addPushMessage(model);
}
}
}
一些配置如图:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONObject;
import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import com.tencent.xinge.Message;
import com.tencent.xinge.MessageIOS;
import com.tencent.xinge.TagTokenPair;
import com.tencent.xinge.XingeApp;
import com.ucmed.common.net.RequestMaker;
import com.ucmed.common.util.DateUtil;
import com.ucmed.nbpt.dataobject.push.PushMessage;
import com.ucmed.nbpt.dataobject.push.SetPush;
import com.ucmed.nbpt.model.UserSessionModel;
import com.ucmed.nbpt.service.UserSessionService;
public class PublicPushProvider {
public static final Logger LOG = Logger.getLogger(PublicPushProvider.class);
private RequestMaker pushRequestMaker;
private PushMessageService pushMessageService;
private SetPushService setPushService;
private UserSessionService userSessionService;
private XingeApp xinGeApp;
private XingeApp xinGeAppIOS;
/**
* 是否测试:0 不是 1:是
*/
private boolean isTest=true;
public void setPushRequestMaker(RequestMaker pushRequestMaker) {
this.pushRequestMaker = pushRequestMaker;
}
public void setIsTest(boolean isTest) {
this.isTest = isTest;
}
public void setSetPushService(SetPushService setPushService) {
this.setPushService = setPushService;
}
public void setPushMessageService(PushMessageService pushMessageService) {
this.pushMessageService = pushMessageService;
}
public void setUserSessionService(UserSessionService userSessionService) {
this.userSessionService = userSessionService;
}
public void setXinGeApp(XingeApp xinGeApp) {
this.xinGeApp = xinGeApp;
}
public void setXinGeAppIOS(XingeApp xinGeAppIOS) {
this.xinGeAppIOS = xinGeAppIOS;
}
/**
* 推送消息
*
* @param model
* @return
*/
public void pushMsg(PushMessage model, String name, String barcode,
String type) {
SetPush push = setPushService.selectByNameAndbarcode(name, type,
barcode);
if (push != null) {
try {
JSONObject p = new JSONObject();
p.put("soft_id", getSoftId(push.getDeviceType()));
p.put("is_test", isTest ? "1" : "0");
p.put("device", push.getDevice());
p.put("alert", model.getContent());
Map<String, String> msg = new HashMap<String, String>();
msg.put("msg_type", model.getType());
msg.put("target_id", model.getTargetId().toString());
msg.put("date", DateUtil.formatDate6(model.getCreateTime()));
if (model.getTmp1() != null)
msg.put("tmp1", model.getTmp1());
if (model.getTmp2() != null)
msg.put("tmp2", model.getTmp2());
if (model.getTmp3() != null)
msg.put("tmp3", model.getTmp3());
if (model.getTmp4() != null)
msg.put("tmp4", model.getTmp4());
p.put("message", msg);
pushRequestMaker.requestActionParams(
"api.push.message.push", p);
} catch (Exception e) {
LOG.error("", e);
}
}
pushMessageService.addPushMessage(model);
}
/**
* 医院通安卓大众版56
* @param userType
* @return
*/
private Object getSoftId(String userType) {
String softId = null;
if ("0".equals(userType)) {//0:Android大众
softId = "56";//原来的推送softId是
} else if ("1".equals(userType)) {
softId = "14";
} else if ("2".equals(userType)) {
softId = "16";
} else if ("3".equals(userType)) {//3:ios大众版
softId = "47";
} else if ("4".equals(userType)) {
softId = "23";
} else if ("5".equals(userType)) {
}
return softId;
}
/**
* 医院通推送
* @param model
*/
public void pushMsgHealth(PushMessage model) {
JSONObject obj = new JSONObject();
//通过用户id 和 用户类型type 1医生2大众 查询出需要推送的用户
List<UserSessionModel> pushList = userSessionService.getUserPush(
model.getAcceptId(), model.getAcceptType());
if (CollectionUtils.isNotEmpty(pushList)) {
for (UserSessionModel push : pushList) {
try {
//通过设备号查询 该用户最后的session
UserSessionModel session = userSessionService.getLastUserSession(push.getDevice());
//该设备号最后登录的用户是当前用户就推送
if(session.getUserId().longValue()==model.getAcceptId().longValue()){
JSONObject p = new JSONObject();
p.put("device", push.getDevice());
//p.put("title", "医院通");
p.put("sound", "default");
p.put("alert", model.getContent());
Map<String, String> msg = new HashMap<String, String>();
msg.put("msg_type", model.getType());
msg.put("target_id", model.getTargetId().toString());
msg.put("date",
DateUtil.formatDate6(model.getCreateTime()));
if (model.getTmp1() != null)
msg.put("tmp1", model.getTmp1());
if (model.getTmp2() != null)
msg.put("tmp2", model.getTmp2());
if (model.getTmp3() != null)
msg.put("tmp3", model.getTmp3());
msg.put("tmp4", "医院通");
msg.put("sound", "default");
p.put("message", msg);
obj = pushRequestMaker.requestActionParams(
"api.push.message.push", p);
model.setRetInfo(obj.optString("return_code","-1"));
}
} catch (Exception e) {
obj.put("return_code", -1);
LOG.error("", e);
}
}
//推送流水
pushMessageService.addPushMessage(model);
}
}
/**
* 信鸽推送
* @param model
*/
@SuppressWarnings("unchecked")
public void pushXinGe(PushMessage model){
JSONObject obj = new JSONObject();
//通过用户id 和 用户类型type 1医生2大众 查询出需要推送的用户
List<UserSessionModel> pushList = userSessionService.getUserPush(
model.getAcceptId(), model.getAcceptType());
if (CollectionUtils.isNotEmpty(pushList)) {
for (UserSessionModel push : pushList) {
try {
//通过设备号查询 该用户最后的session
UserSessionModel session = userSessionService.getLastUserSession(push.getDevice());
//该设备号最后登录的用户是当前用户就推送
if(session.getUserId().longValue()==model.getAcceptId().longValue()){
JSONObject p = new JSONObject();
p.put("alert", model.getContent());
Map<String, String> msg = new HashMap<String, String>();
msg.put("msg_type", model.getType());
msg.put("target_id", model.getTargetId().toString());
msg.put("date",
DateUtil.formatDate6(model.getCreateTime()));
if (model.getTmp1() != null){
msg.put("tmp1", model.getTmp1());
}
if (model.getTmp2() != null){
msg.put("tmp2", model.getTmp2());
}
if (model.getTmp3() != null){
msg.put("tmp3", model.getTmp3());
msg.put("sound", "default");
}
if (model.getContent() != null){
msg.put("content", model.getContent());
}
p.put("message", msg);
// XingeApp xinge = new XingeApp(Constants.XINGE_ANDROID_PATIENT_ACCESSID,
// Constants.XINGE_ANDROID_PATIENT_SECRETKEY);
org.json.JSONObject ret = new org.json.JSONObject();
String deviceType = session.getDeviceType();
//设备号类型 0:Android大众,1:Android医生,2:ios医生版,3:ios大众版,4:win8大众版
if ("0".equals(deviceType)) {
//安卓Message
Message mess = new Message(); // $mess = new MessageIOS();
mess.setType(Message.TYPE_MESSAGE);
mess.setTitle(model.getTmp4());
mess.setContent(model.getContent());
mess.setCustom(JSONObject.fromObject(msg));
ret = xinGeApp.pushSingleAccount(0, push.getDevice(), mess);
model.setRetInfo(ret.optString("ret_code")+","+push.getDevice());
}else if ("3".equals(deviceType)) {
MessageIOS ios = new MessageIOS();
ios.setAlert(model.getTmp4());
ios.setBadge(1);
ios.setSound("beep.wav");
ios.setCustom(JSONObject.fromObject(msg));
//为设备号设置Tag
List<TagTokenPair> pairs = new ArrayList<TagTokenPair>();
pairs.add(new TagTokenPair("tag1",push.getDevice()));
org.json.JSONObject retTag = xinGeAppIOS.BatchSetTag(pairs);
if(0 == retTag.optInt("ret_code")) {
List<String> list = new ArrayList<String>();
list.add("tag1");
ret = xinGeAppIOS.pushTags(0, list, "OR", ios,2);
org.json.JSONObject retDel = xinGeAppIOS.BatchDelTag(pairs);
LOG.info("苹果推送成功删除tag! ret_code:"+retDel);
}
// ret = xinGeAppIOS.pushSingleAccount(0, push.getDevice(), ios, xinGeAppIOS.IOSENV_PROD);
model.setRetInfo(ret.optString("ret_code")+","+push.getDevice());
} else {
LOG.error("device_type 设备号类型传入有误!推送失败");
model.setRetInfo("device_type 设备号类型传入有误!推送失败");
}
}
} catch (Exception e) {
obj.put("return_code", -1);
LOG.error("", e);
}
}
//推送流水
pushMessageService.addPushMessage(model);
}
}
}
一些配置如图: