Browse Source

feat: 企业推送消息接口

master
wangxiang 2 years ago
parent
commit
7f1fee8f5d
  1. 7
      kicc-platform/kicc-platform-api/kicc-common-api/src/main/java/com/cloud/kicc/commonbiz/api/entity/PushConcernFanType.java
  2. 6
      kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/controller/PushApplicationController.java
  3. 2
      kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/controller/PushConcernFanTypeController.java
  4. 8
      kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/service/IPushApplicationService.java
  5. 209
      kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/service/impl/PushApplicationServiceImpl.java

7
kicc-platform/kicc-platform-api/kicc-common-api/src/main/java/com/cloud/kicc/commonbiz/api/entity/PushConcernFanType.java

@ -30,8 +30,11 @@ public class PushConcernFanType extends CommonEntity {
@ApiModelProperty("类型名称") @ApiModelProperty("类型名称")
private String name; private String name;
@ApiModelProperty("用户ID") @ApiModelProperty("关注用户")
private String userId; private String concernUserId;
@ApiModelProperty("粉丝用户")
private String fanUserId;
@ApiModelProperty("推送类型ID") @ApiModelProperty("推送类型ID")
private String typeId; private String typeId;

6
kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/controller/PushApplicationController.java

@ -95,9 +95,9 @@ public class PushApplicationController {
} }
@PostMapping("/send") @PostMapping("/send")
@ApiOperation(value = "消息发送") @ApiOperation(value = "企业推送消息")
public R mapPresetPointConfirmPushMsgTest(@Valid @RequestBody PushChatMessage pushChatMessage) { public R enterpriseMessageSend(@Valid @RequestBody PushChatMessage pushChatMessage) {
iPushApplicationService.messageSend(pushChatMessage); iPushApplicationService.enterpriseMessageSend(pushChatMessage);
return R.ok(true); return R.ok(true);
} }

2
kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/controller/PushConcernFanTypeController.java

@ -35,7 +35,7 @@ public class PushConcernFanTypeController {
private LambdaQueryWrapper<PushConcernFanType> getQueryWrapper(PushConcernFanType pushConcernFanType) { private LambdaQueryWrapper<PushConcernFanType> getQueryWrapper(PushConcernFanType pushConcernFanType) {
return new LambdaQueryWrapper<PushConcernFanType>() return new LambdaQueryWrapper<PushConcernFanType>()
.eq(PushConcernFanType::getUserId, pushConcernFanType.getUserId()) .eq(PushConcernFanType::getConcernUserId, pushConcernFanType.getConcernUserId())
.eq(StrUtil.isNotBlank(pushConcernFanType.getName()), PushConcernFanType::getName, pushConcernFanType.getName()); .eq(StrUtil.isNotBlank(pushConcernFanType.getName()), PushConcernFanType::getName, pushConcernFanType.getName());
} }

8
kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/service/IPushApplicationService.java

@ -17,10 +17,10 @@ import io.lettuce.core.api.push.PushMessage;
public interface IPushApplicationService extends IService<PushApplication> { public interface IPushApplicationService extends IService<PushApplication> {
/** /**
* 消息发送 * 针对企业公开外部消息推送接口
* @param * @param pushChatMessage 推送消息
* @return * @return void
*/ */
void messageSend(PushChatMessage pushChatMessage); void enterpriseMessageSend(PushChatMessage pushChatMessage);
} }

209
kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/service/impl/PushApplicationServiceImpl.java

@ -1,27 +1,19 @@
package com.cloud.kicc.commonbiz.service.impl; package com.cloud.kicc.commonbiz.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.extra.servlet.ServletUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cloud.kicc.common.core.api.R;
import com.cloud.kicc.common.core.constant.SecurityConstants;
import com.cloud.kicc.common.core.exception.CheckedException; import com.cloud.kicc.common.core.exception.CheckedException;
import com.cloud.kicc.commonbiz.api.entity.*; import com.cloud.kicc.commonbiz.api.entity.*;
import com.cloud.kicc.commonbiz.mapper.PushApplicationMapper; import com.cloud.kicc.commonbiz.mapper.PushApplicationMapper;
import com.cloud.kicc.commonbiz.service.*; import com.cloud.kicc.commonbiz.service.*;
import com.cloud.kicc.commonbiz.util.PushClientUtil; import com.cloud.kicc.commonbiz.util.PushClientUtil;
import com.cloud.kicc.system.api.entity.User;
import com.cloud.kicc.system.api.feign.RemoteUserService;
import io.lettuce.core.api.push.PushMessage;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.RequestContextHolder;
@ -48,110 +40,117 @@ import java.util.stream.Collectors;
public class PushApplicationServiceImpl extends ServiceImpl<PushApplicationMapper, PushApplication> implements IPushApplicationService { public class PushApplicationServiceImpl extends ServiceImpl<PushApplicationMapper, PushApplication> implements IPushApplicationService {
private final OkHttpClient okHttpClient; private final OkHttpClient okHttpClient;
//private final IPushUserManageService iPushUserManageService; private final IPushConcernFanService iPushConcernFanService;
//private final IPushMessageService iPushMessageService; private final IPushBlacklistService iPushBlacklistService;
private final RemoteUserService remoteUserService; private final IPushChatMessageService iPushChatMessageService;
//private final IPushCustomTypeService iPushCustomTypeService; private final IPushConcernFanTypeService iPushConcernFanTypeService;
@Override @Override
public void messageSend(PushChatMessage pushChatMessage) { public void enterpriseMessageSend(PushChatMessage pushChatMessage) {
/*if (StrUtil.isBlank(pushChatMessage.getPushUserId()) || StrUtil.isBlank(pushChatMessage.getMessageSecret())) { if (StrUtil.isBlank(pushChatMessage.getUserId()) || StrUtil.isBlank(pushChatMessage.getMessageSecret())) {
throw new CheckedException("当前发送方用户ID与推送应用密钥必填!"); throw new CheckedException("当前推送方用户ID与推送应用密钥必填!");
}*/
R<User> result = remoteUserService.selectByUserId(pushChatMessage.getPushTypeId(), SecurityConstants.FROM_IN);
if (result == null || result.getData() == null) {
throw new CheckedException("用户不存在");
} }
// 第三方发送前较验数据 PushApplication pushApplication = baseMapper.selectOne(Wrappers.<PushApplication>lambdaQuery()
if (result.getData().getUserType().equals("9")) { .eq(PushApplication::getMessageSecret, pushChatMessage.getMessageSecret())
PushApplication pushApplication = baseMapper.selectOne(Wrappers.<PushApplication>lambdaQuery() .eq(PushApplication::getCreateById, pushChatMessage.getUserId())
.eq(PushApplication::getMessageSecret, pushChatMessage.getMessageSecret()).eq(PushApplication::getStatus, "0")); .eq(PushApplication::getStatus, "0"));
pushApplication = Optional.of(pushApplication).orElseThrow(() -> new CheckedException("你当前没有权限发送消息,请联系管理员!")); pushApplication = Optional.of(pushApplication).orElseThrow(() -> new CheckedException("你当前没有权限发送消息,请联系管理员!"));
HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
// 如果ip地址存在即验证发送方ip HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
if (StrUtil.isNotBlank(pushApplication.getIgnoreIp()) && !StrUtil.contains(pushApplication.getIgnoreIp(), ServletUtil.getClientIP(request))) { // 如果ip地址存在即验证发送方ip
throw new CheckedException("你的ip地址不正确,请检查消息应用中设置的ip地址!"); if (StrUtil.isNotBlank(pushApplication.getIgnoreIp()) && !StrUtil.contains(pushApplication.getIgnoreIp(), ServletUtil.getClientIP(request))) {
} throw new CheckedException("你的ip地址不正确,请检查消息应用中设置的ip地址!");
} }
// 查询当前用户设置的自定义快捷方式消息提醒属性 // 配置推送用户
/*PushCustomType pushCustomType = iPushCustomTypeService.getOne(Wrappers.<PushCustomType>lambdaQuery() if (StrUtil.isBlank(pushChatMessage.getAlias())) {
.eq(PushCustomType::getId, pushChatMessage.getPushTypeId()).eq(PushCustomType::getCreateById, pushChatMessage.getFromUserId())); List<PushConcernFan> pushConcernFanList = iPushConcernFanService.list(Wrappers.<PushConcernFan>lambdaQuery().eq(PushConcernFan::getFanUserId, pushChatMessage.getUserId()));
if (ObjectUtil.isNotEmpty(pushCustomType)) { pushChatMessage.setAlias(pushConcernFanList.stream().map(item -> item.getConcernUserId()).collect(Collectors.joining()));
pushMessage.setPlaySound(pushCustomType.getPlaySound()); }
pushMessage.setPlayVibrate(pushCustomType.getPlayVibrate());
pushMessage.setPlayLights(pushCustomType.getPlayLights());
if (StrUtil.isNotBlank(pushCustomType.getCustomPlayFileName())) pushMessage.setCustomPlayFileName(pushCustomType.getCustomPlayFileName());
}*/
List<String> blacklist = CollectionUtil.newArrayList(); /*iPushPassListService.list(Wrappers.<PushPassList>lambdaQuery()
.eq(PushPassList::getFromPushId, pushMessage.getFromUserId()).eq(PushPassList::getType, "0"))
.stream().map(item -> item.getToPushId()).collect(Collectors.toList());*/
List<String> whitelist = CollectionUtil.newArrayList(); /*iPushPassListService.list(Wrappers.<PushPassList>lambdaQuery()
.eq(PushPassList::getFromPushId, pushMessage.getFromUserId()).eq(PushPassList::getType, "1"))
.stream().map(item -> item.getToPushId()).collect(Collectors.toList());*/
/*List<PushUserManage> pushList = iPushUserManageService.list(Wrappers.<PushUserManage>lambdaQuery()
.eq(PushUserManage::getFromUserId, pushMessage.getFromUserId()).eq(PushUserManage::getStatus, "1"))
.stream().filter(item -> !blacklist.contains(item.getToUserId()) || !whitelist.contains(item.getToUserId())).collect(Collectors.toList());
pushList.forEach(item -> send(pushMessage, item.getToUserId(), item.getPlaySound(), item.getPlayVibrate(), item.getPlayLights()));
whitelist.forEach(item -> {
pushMessage.setPlaySound("0");
pushMessage.setPlayVibrate("0");
pushMessage.setPlayLights("0");
send(pushMessage, item, pushMessage.getPlaySound(), pushMessage.getPlayVibrate(), pushMessage.getPlayLights());
});*/
}
// 过滤掉黑名单用户
List<PushBlacklist> pushBlacklists = iPushBlacklistService.list(Wrappers.<PushBlacklist>lambdaQuery().eq(PushBlacklist::getFanUserId, pushChatMessage.getUserId()));
pushBlacklists.forEach(item -> pushChatMessage.getAlias().replaceAll(item.getConcernUserId() + ",|$", ""));
// 查询推送用户设置的推送类型,如果参数中没有指定则采用默认的推送类型
List<PushConcernFanType> pushConcernFanTypeList = iPushConcernFanTypeService.list(Wrappers.<PushConcernFanType>lambdaQuery()
.eq(PushConcernFanType::getFanUserId, pushChatMessage.getUserId())
.eq(StrUtil.isNotBlank(pushChatMessage.getPushTypeId()), PushConcernFanType::getTypeId, pushChatMessage.getPushTypeId())
.eq(StrUtil.isBlank(pushChatMessage.getPushTypeId()), PushConcernFanType::getDefaultType, "1"));
// 推送消息
StrUtil.split(pushChatMessage.getAlias(), ",").forEach(concernUserId -> {
Optional<PushConcernFanType> pushConcernFanTypeOptional = pushConcernFanTypeList.stream().filter(item -> item.getConcernUserId().equals(concernUserId)).findFirst();
if (pushConcernFanTypeOptional.isPresent()) {
PushConcernFanType pushConcernFanType = pushConcernFanTypeOptional.get();
pushChatMessage.setPushTypeId(pushConcernFanType.getTypeId());
pushChatMessage.setPlayLights(pushConcernFanType.getPlayLights());
pushChatMessage.setPlaySound(pushConcernFanType.getPlaySound());
pushChatMessage.setPlayVibrate(pushConcernFanType.getPlayVibrate());
pushChatMessage.setPlayToText(pushConcernFanType.getPlayToText());
pushChatMessage.setSound(pushConcernFanType.getOfflineRingtone());
pushChatMessage.setOnlineRingtone(pushConcernFanType.getOnlineRingtone());
}
pushChatMessage.setType("customizedcast");
pushChatMessage.setDisplayType("notification");
pushChatMessage.setAliasType(PushClientUtil.uPushUserAliasType);
pushChatMessage.setAlias(concernUserId);
JSONObject custom = new JSONObject();
custom.put("fanUserId", pushChatMessage.getUserId());
custom.put("offlineRingtone", pushChatMessage.getSound());
custom.put("onlineRingtone", pushChatMessage.getOnlineRingtone());
custom.put("playToText", BooleanUtil.toBoolean(pushChatMessage.getPlayToText()));
custom.put("playSound", BooleanUtil.toBoolean(pushChatMessage.getPlaySound()));
custom.put("playVibrate", BooleanUtil.toBoolean(pushChatMessage.getPlayVibrate()));
custom.put("playLights", BooleanUtil.toBoolean(pushChatMessage.getPlayLights()));
pushChatMessage.setCustom(custom.toString());
JSONObject jsonObject = new JSONObject();
jsonObject.put("production_mode", PushClientUtil.PRODUCTION_MODE);
jsonObject.put("type", pushChatMessage.getType());
jsonObject.put("description", pushChatMessage.getRemarks());
jsonObject.put("alias_type", pushChatMessage.getAliasType());
jsonObject.put("alias", pushChatMessage.getAlias());
JSONObject payload = new JSONObject();
payload.put("display_type", pushChatMessage.getDisplayType());
JSONObject body = new JSONObject();
body.put("ticker", pushChatMessage.getTitle());
body.put("text", pushChatMessage.getText());
body.put("title", pushChatMessage.getTitle());
body.put("sound", pushChatMessage.getSound());
body.put("after_open", "go_custom");
body.put("custom", pushChatMessage.getCustom());
if (BooleanUtil.toBoolean(pushChatMessage.getPlaySound())) {
body.put("play_sound", true);
}
if (BooleanUtil.toBoolean(pushChatMessage.getPlayVibrate())) {
body.put("play_vibrate", true);
}
if (BooleanUtil.toBoolean(pushChatMessage.getPlayLights())) {
body.put("play_lights", true);
}
payload.put("body", body);
jsonObject.put("payload", payload);
JSONObject policy = new JSONObject();
policy.put("expire_time", LocalDateTimeUtil.now().plusDays(3).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
policy.put("out_biz_no", LocalDateTimeUtil.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
jsonObject.put("policy", policy);
try {
PushClientUtil pushClientUtil = new PushClientUtil(okHttpClient);
pushClientUtil.send(jsonObject);
iPushChatMessageService.save(pushChatMessage);
} catch (Exception e) {
e.printStackTrace();
}
private void send(PushMessage pushMessage, String toUserId, String playSound, String playVibrate, String playLights) { });
/*// 设置默认数据
pushMessage.setType("customizedcast");
pushMessage.setDisplayType("notification");
pushMessage.setAliasType(PushClientUtil.uPushUserAliasType);
pushMessage.setAlias(toUserId);
JSONObject custom = new JSONObject();
custom.put("sendUserId", pushMessage.getFromUserId());
custom.put("customPlayFileName", pushMessage.getCustomPlayFileName());
custom.put("playSound", BooleanUtil.toBoolean(playSound));
custom.put("playVibrate", BooleanUtil.toBoolean(playVibrate));
custom.put("playLights", BooleanUtil.toBoolean(playLights));
pushMessage.setCustom(custom.toString());
JSONObject jsonObject = new JSONObject();
jsonObject.put("production_mode", PushClientUtil.PRODUCTION_MODE);
jsonObject.put("type", pushMessage.getType());
jsonObject.put("description", pushMessage.getRemarks());
jsonObject.put("alias_type", pushMessage.getAliasType());
jsonObject.put("alias", pushMessage.getAlias());
JSONObject payload = new JSONObject();
payload.put("display_type", pushMessage.getDisplayType());
JSONObject body = new JSONObject();
body.put("ticker", pushMessage.getTitle());
body.put("text", pushMessage.getText());
body.put("title", pushMessage.getTitle());
body.put("sound", pushMessage.getSound());
body.put("after_open", "go_custom");
body.put("custom", pushMessage.getCustom());
body.put("play_sound", BooleanUtil.toBoolean(playSound) ? false : !BooleanUtil.toBoolean(pushMessage.getPlaySound()));
body.put("play_vibrate", BooleanUtil.toBoolean(playVibrate) ? false : !BooleanUtil.toBoolean(pushMessage.getPlayVibrate()));
body.put("play_lights", BooleanUtil.toBoolean(playLights) ? false : !BooleanUtil.toBoolean(pushMessage.getPlayLights()));
payload.put("body", body);
jsonObject.put("payload", payload);
JSONObject policy = new JSONObject();
policy.put("expire_time", LocalDateTimeUtil.now().plusDays(3).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
policy.put("out_biz_no", LocalDateTimeUtil.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
jsonObject.put("policy", policy);
try {
PushClientUtil pushClientUtil = new PushClientUtil(okHttpClient);
pushClientUtil.send(jsonObject);
iPushMessageService.save(pushMessage);
} catch (Exception e) {
e.printStackTrace();
}*/
} }
} }

Loading…
Cancel
Save