package cn.gistack.alerts.push.service.impl; import cn.gistack.alerts.push.service.IPushService; import cn.gistack.alerts.push.utils.GeTuiUtils; import cn.gistack.alerts.push.vo.PushVO; import cn.gistack.alerts.push.vo.UniCloudReturnRes; import cn.gistack.sm.message.entity.MessageRecord; import cn.gistack.sm.message.feign.IMessageClient; import lombok.AllArgsConstructor; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.redis.cache.BladeRedis; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.Func; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.util.*; import java.util.concurrent.atomic.AtomicReference; @Service @AllArgsConstructor public class PushServiceImpl implements IPushService { private static final String PUSH_CLIENT_ID = "push:client:id:"; private static final String UNI_CLOUD_PUSH_URL = "https://fc-mp-ff11cc4d-ca8e-4b47-a57f-e26804379530.next.bspapp.com/push"; private BladeRedis bladeRedis; private IMessageClient messageClient; private GeTuiUtils geTuiUtils; @Override public Boolean saveCId(String userId, String cId) { bladeRedis.set(PUSH_CLIENT_ID + userId, cId); return Boolean.TRUE; } @Override public Boolean pushMessageList(List messageRecordList) { // 加入测试人员 // addSendMsgTest(messageRecordList); List cIdList = new ArrayList<>(); AtomicReference push = new AtomicReference<>(false); //相同的消息推送给多用户 messageRecordList.forEach(messageRecord -> { //获取用户cId String clientId = getClientIdByUserId(messageRecord.getRecipient()); if (null!=clientId && !clientId.equals("")) { cIdList.add(clientId); PushVO pushVO = new PushVO(); pushVO.setCIds(cIdList); pushVO.setTitle(messageRecord.getTheme()); pushVO.setContent(messageRecord.getContent()); HashMap payload = new HashMap<>(); payload.put("title",messageRecord.getTheme()); payload.put("content", messageRecord.getContent()); payload.put("payload", "test"); pushVO.setPayload(payload); push.set(pushMessage(pushVO)); } }); return push.get(); } /** * 新增测试信息 * * @param messageRecordList */ private void addSendMsgTest(List messageRecordList) { MessageRecord messageRecord = new MessageRecord(); messageRecord.setRecipient("1654164141753593858"); messageRecord.setContent(messageRecordList.get(0).getContent()); messageRecord.setTheme(messageRecordList.get(0).getTheme()); messageRecord.setSender(AuthUtil.getUserId().toString()); messageRecord.setSource("智能告警"); messageRecord.setStatus(0); // 加入集合 messageRecordList.add(messageRecord); } @Override public Boolean clearCId(String userId) { Boolean del = bladeRedis.del(PUSH_CLIENT_ID + userId); return del; } @Override public Boolean pushMessageOnLaunch(String userId) { //获取未读的消息列表 List notReadList = messageClient.getNotReadList(userId); PushVO pushVO = new PushVO(); List cIdList = new ArrayList<>(); //设置cId cIdList.add(getClientIdByUserId(userId)); pushVO.setCIds(cIdList); //设置标题和内容 notReadList.forEach(messageRecord -> { pushVO.setTitle(messageRecord.getTheme()); pushVO.setContent(messageRecord.getContent()); //推送消息 pushMessage(pushVO); }); return true; } @Override public Boolean pushMessageByUserId(PushVO pushVO) { if (Func.isEmpty(pushVO.getUserId())) { throw new ServiceException("请填写用户id!"); } String clientIdByUserId = getClientIdByUserId(pushVO.getUserId()); List cIdList = new ArrayList<>(); cIdList.add(clientIdByUserId); pushVO.setCIds(cIdList); HashMap payload = new HashMap<>(); payload.put("title", pushVO.getTitle()); payload.put("content", pushVO.getContent()); payload.put("payload", "test"); pushVO.setPayload(payload); return pushMessage(pushVO); } @Override public Boolean geTuiPushMessage(PushVO pushVO) { List cIdList = new ArrayList<>(); cIdList.add(getClientIdByUserId(pushVO.getUserId())); // return geTuiUtils.pushMsg(cIdList, pushVO.getTitle(), pushVO.getContent()); return geTuiUtils.myPushMessage(cIdList, pushVO.getTitle(), pushVO.getContent()); } @Override public Boolean pushMessageByUserList(PushVO pushVO) { if (Func.isEmpty(pushVO.getUserId())) { throw new ServiceException("请填写用户id!"); } //获取userIdList List userIdList = Arrays.asList(pushVO.getUserId().split(",")); List messageRecordList = new ArrayList<>(); userIdList.forEach(userId->{ MessageRecord messageRecord = new MessageRecord(); messageRecord.setContent(pushVO.getContent()); messageRecord.setTheme(pushVO.getTitle()); messageRecord.setRecipient(userId); messageRecordList.add(messageRecord); }); Boolean aBoolean = pushMessageList(messageRecordList); return aBoolean; } /** * 根据用户id从redis中获取cid * * @param userId * @return */ public String getClientIdByUserId(String userId) { if (Func.isEmpty(userId)) { throw new ServiceException("请填写用户id!"); } return bladeRedis.get(PUSH_CLIENT_ID + userId); } /** * 2.0云函数消息推送 * * @param pushVO * @return */ public Boolean pushMessage(PushVO pushVO) { RestTemplate template = new RestTemplate(); Map params = new LinkedHashMap<>(); //用户cId,可数组,可字符串 params.put("pushClientid", pushVO.getCIds()); //标题 params.put("title", pushVO.getTitle()); //内容 params.put("content", pushVO.getContent()); params.put("requestId", UUID.randomUUID()); params.put("payload", pushVO.getPayload()); UniCloudReturnRes uniCloudReturnRes = template.postForObject(UNI_CLOUD_PUSH_URL, params, UniCloudReturnRes.class); return uniCloudReturnRes.getErrCode().equals("0") ? true : false; } /** * 对集合按指定数量进行分组 * * @param list 分组的集合 * @param quantity 数量 * @param * @return */ public List> groupListByQuantity(List list, int quantity) { if (list == null || list.size() == 0) { return list; } if (quantity <= 0) { new IllegalArgumentException("Wrong quantity."); } List wrapList = new ArrayList(); int count = 0; while (count < list.size()) { wrapList.add(list.subList(count, (count + quantity) > list.size() ? list.size() : count + quantity)); count += quantity; } return wrapList; } }