zhongrj
2023-08-08 2132e02e0d1a06b7e71be2a3aa92dbcc856783d9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
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.*;
 
@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<MessageRecord> messageRecordList) {
        // 加入测试人员
        addSendMsgTest(messageRecordList);
        PushVO pushVO = new PushVO();
        List<String> cIdList = new ArrayList<>();
        //相同的消息推送给多用户
        messageRecordList.forEach(messageRecord -> {
            //获取用户cId
            String clientId = getClientIdByUserId(messageRecord.getRecipient());
            cIdList.add(clientId);
        });
        pushVO.setCIds(cIdList);
        pushVO.setTitle(messageRecordList.get(0).getTheme());
        pushVO.setContent(messageRecordList.get(0).getContent());
 
        return pushMessage(pushVO);
    }
 
    /**
     * 新增测试信息
     * @param messageRecordList
     */
    private void addSendMsgTest(List<MessageRecord> 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<MessageRecord> notReadList = messageClient.getNotReadList(userId);
 
        PushVO pushVO = new PushVO();
        List<String> 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<String> cIdList = new ArrayList<>();
        cIdList.add(clientIdByUserId);
        pushVO.setCIds(cIdList);
 
        return pushMessage(pushVO);
    }
 
    @Override
    public Boolean geTuiPushMessage(PushVO pushVO) {
        List<String> cIdList = new ArrayList<>();
        cIdList.add(getClientIdByUserId(pushVO.getUserId()));
//        return geTuiUtils.pushMsg(cIdList, pushVO.getTitle(), pushVO.getContent());
        return geTuiUtils.myPushMessage(cIdList, pushVO.getTitle(), pushVO.getContent());
    }
 
    /**
     * 根据用户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<String, Object> params = new LinkedHashMap<>();
        //用户cId,可数组,可字符串
        params.put("pushClientid", pushVO.getCIds());
        //标题
        params.put("title", pushVO.getTitle());
        //内容
        params.put("content", pushVO.getContent());
 
        params.put("requestId", UUID.randomUUID());
//        UniCloudReturnRes uniCloudReturnRes = template.getForObject(UNI_CLOUD_PUSH_URL,UniCloudReturnRes.class,params);
        UniCloudReturnRes uniCloudReturnRes = template.postForObject(UNI_CLOUD_PUSH_URL, params, UniCloudReturnRes.class);
        return uniCloudReturnRes.getErrCode().equals("0") ? true : false;
 
    }
}