DaySubJob.java 12 KB
Newer Older
吴泽佳's avatar
吴泽佳 committed
1 2 3 4 5 6 7 8 9 10 11 12 13
package com.tanpu.feo.feojob.jobs;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tanpu.common.constant.BizStatus;
import com.tanpu.feo.feojob.config.MorningPaperProperties;
吴泽佳's avatar
吴泽佳 committed
14 15
import com.tanpu.feo.feojob.dao.user.entity.*;
import com.tanpu.feo.feojob.dao.user.mapper.*;
16 17
import com.tanpu.feo.feojob.feign.shorter.ShorterFeign;
import com.tanpu.feo.feojob.feign.shorter.ShorterResp;
吴泽佳's avatar
吴泽佳 committed
18 19 20 21 22 23 24 25 26 27 28 29 30 31
import com.tanpu.feo.feojob.feign.wxcp.FeignClientForWxCp;
import com.tanpu.feo.feojob.feign.wxmp.FeignClientForWxMp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
吴泽佳's avatar
吴泽佳 committed
32
import java.util.Date;
吴泽佳's avatar
吴泽佳 committed
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
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author zejia zj wu
 * @date 2021-08-10
 * @Description 早报推送
 */
@Component
@Slf4j
public class DaySubJob {

    @Resource
    private DaySubjectMapper daySubjectMapper;
    @Resource
    private UserInfoMapper userInfoMapper;
    @Resource
    private OrgExtMapper orgExtMapper;
    @Resource
    MorningPaperProperties morningPaperProperties;
    @Value("${daySubject.daySubjectUrl}")
    private String daySubjectUrl;
    @Resource
    private FeignClientForWxCp feignClientForWxCp;
    @Resource
    private FeignClientForWxMp feignClientForWxMp;
吴泽佳's avatar
吴泽佳 committed
61 62
    @Resource
    private DaySelectionMapper daySelectionMapper;
吴泽佳's avatar
吴泽佳 committed
63 64
    @Resource
    private OrgMapper orgMapper;
65 66
    @Resource
    private ShorterFeign shorterFeign;
吴泽佳's avatar
吴泽佳 committed
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88


    @Scheduled(cron = "0 30 7 * * ? ")   //
    public void execute() {
        log.info("====== 开始执行 DaySubJob ======");
        try {
            sendDaySubjectMessage();
        } catch (Exception e) {
            log.error("====== 异常结束执行 DaySubJob ,错误:{}=======", e);
        }
        log.info("====== 结束执行 DaySubJob ======");
    }

    public void sendDaySubjectMessage() {
        List<DaySubjectEntity> daySubjectList = getDaySubList(DateUtil.today());
        if (CollectionUtils.isEmpty(daySubjectList)) {
            log.info("====== DaySubJob 暂无需要推送的早报");
            return;
        }
        Map<String, List<DaySubjectEntity>> stringListMap = daySubjectList.stream().collect(Collectors.groupingBy(DaySubjectEntity::getDsPt));
        int size = morningPaperProperties.getMainTitles().size();
        String mainTitle = morningPaperProperties.getMainTitles().get(RandomUtil.randomInt(0, size));
89 90 91 92 93 94 95
        for (String orgId : stringListMap.keySet()) {
            log.info("开始推送机构(orgId={})的早报", orgId);
            //查询orgCode
            OrgEntity orgEntity = orgMapper.selectOne(new LambdaQueryWrapper<OrgEntity>().eq(OrgEntity::getId, orgId).last("limit 1"));
            if (ObjectUtil.isNull(orgEntity)) {
                log.error("找不到机构(orgId={})的信息", orgId);
                return;
吴泽佳's avatar
吴泽佳 committed
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
            List<DaySubjectEntity> daySubjectEntities = stringListMap.get(orgId);
            if (CollectionUtils.isEmpty(daySubjectEntities)) {
                log.warn("当前机构(orgCode={})没有要推送的早报", orgEntity.getOrgCode());
                return;
            }
            sendDaySubject(orgId, daySubjectEntities, mainTitle);
        }
    }

    public void sendDaySubject(String orgId, List<DaySubjectEntity> daySubjectList,String mainTitle){
        if (CollectionUtils.isEmpty(daySubjectList) || StringUtils.isBlank(orgId) || StringUtils.isBlank(mainTitle)) {
            return;
        }
        OrgEntity orgEntity = orgMapper.selectOne(new LambdaQueryWrapper<OrgEntity>().eq(OrgEntity::getId, orgId).last("limit 1"));
        if (orgEntity == null) {
            return;
        }
        // 查询 机构配置信息
        OrgExtEntity orgExtEntity = orgExtMapper.selectOne(new LambdaQueryWrapper<OrgExtEntity>()
                .eq(OrgExtEntity::getOrgId, orgId)
                .eq(OrgExtEntity::getDeleteTag, BizStatus.DeleteTag.tag_init_str)
                .last("limit 1"));
        String jsonKey = ObjectUtil.isNotNull(orgExtEntity) ? orgExtEntity.getJsonWxcpKey() : null;
        if (StringUtils.isBlank(jsonKey)) {
            return;
        }

        //在orgExt 表中有查到 jsonKey 执行消息推送任务
        JSONObject jsonKeyInfo = JSONUtil.parseObj(jsonKey);
        // 查询该机构下 用户
        LambdaQueryWrapper<UserInfoEntity> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(UserInfoEntity::getDeletetag, BizStatus.DeleteTag.tag_init_str)
                .eq(UserInfoEntity::getOrgId, orgId)
                .eq(UserInfoEntity::getLevel, "2");
        List<UserInfoEntity> userInfoEntities = userInfoMapper.selectList(queryWrapper);
        if (CollectionUtils.isEmpty(userInfoEntities)) {
            log.info("机构(orgCode={})没有需要推送早报的人员", orgEntity.getOrgCode());
            return;
        }
        log.info("机构(orgCode={})本次推送{}人,早报文章{}篇", orgEntity.getOrgCode(), userInfoEntities.size(), daySubjectList.size());

吴泽佳's avatar
吴泽佳 committed
138

139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
        for (UserInfoEntity userInfoEntity : userInfoEntities) {
            for (DaySubjectEntity daySubjectEntity : daySubjectList) {
                HashMap<String, String> parmMap = new HashMap<>();
                parmMap.put("type", "text");
                String wxOpenId = userInfoEntity.getUiOpenid();
                String wxcpUId = userInfoEntity.getWxcpUid();
                if (StringUtils.isNotBlank(wxcpUId)) {
                    // 1 企业微信 推送
                    String agentId = jsonKeyInfo.getStr("agentId");
                    String corpId = jsonKeyInfo.getStr("corpId");
                    // ww=corpId&orgCode=orgCode
                    String link = String.format(daySubjectUrl, corpId, orgEntity.getOrgCode(), daySubjectEntity.getId());
                    String url = getShortUrl(link);
                    if (StringUtils.isBlank(url)) {
                        log.error("早报的短链生成失败, orgCode: {}, link: {}", orgEntity.getOrgCode(), link);
                        continue;
                    }
                    log.info("早报推送使用短链, short-url: {}, origin-url: {}", url, link);
                    StringBuilder sb = new StringBuilder();
                    sb.append(mainTitle).append("\n\n")
                            .append(morningPaperProperties.getSubTitle()).append("\n\n")
                            .append("<a href=\"")
                            .append(url).append("\">")
                            .append("快去转发获客吧")
                            .append("</a>\n\n");
                    parmMap.put("content", sb.toString());
                    log.info("===企业微信 推送===userID:{} agentId:{} corpId:{} wxcpUId:{} parmMap:{}", userInfoEntity.getId(), agentId, corpId, wxcpUId, JSONUtil.toJsonStr(parmMap));
                    if (StrUtil.isNotBlank(agentId) && StrUtil.isNotBlank(corpId) && StrUtil.isNotBlank(wxcpUId) && StrUtil.isNotBlank(JSONUtil.toJsonStr(parmMap))) {
                        feignClientForWxCp.sendMessage(agentId, corpId, wxcpUId, JSONUtil.toJsonStr(parmMap));
                    }
                }
                if (StringUtils.isNotBlank(wxOpenId)) {
                    // 2 公众号推送
                    String wxAppID = jsonKeyInfo.getStr("sendMessageAppId");
                    // ww=wxAppID&orgCode=orgCode
                    String link = String.format(daySubjectUrl, wxAppID, orgEntity.getOrgCode(), daySubjectEntity.getId());
                    String url = getShortUrl(link);
                    if (StringUtils.isBlank(url)) {
                        log.error("早报的短链生成失败, orgCode: {}, link: {}", orgEntity.getOrgCode(), link);
                        continue;
                    }
                    log.info("早报推送使用短链, short-url: {}, origin-url: {}", url, link);
                    StringBuilder sb = new StringBuilder();
                    sb.append(mainTitle).append("\n\n")
                            .append(morningPaperProperties.getSubTitle()).append("\n\n")
                            .append("<a href=\"")
                            .append(url).append("\">")
                            .append("快去转发获客吧")
                            .append("</a>\n\n");
                    parmMap.put("content", sb.toString());
                    log.info("===公众号 推送=== userID:{} wxAppID:{} wxOpenId:{} parmMap:{}", userInfoEntity.getId(), wxAppID, wxOpenId, JSONUtil.toJsonStr(parmMap));
                    if (StrUtil.isNotBlank(wxAppID) && StrUtil.isNotBlank(wxOpenId) && StrUtil.isNotBlank(JSONUtil.toJsonStr(parmMap))) {
                        feignClientForWxMp.sendMessage(wxAppID, wxOpenId, JSONUtil.toJsonStr(parmMap));
                    }
                } else {
                    if (userInfoEntity.getUiTelphone() != null && userInfoEntity.getUiTelphone().startsWith("1700000")) {
                        log.info("内部测试账号,跳过, uid: {}, telphone: {}", userInfoEntity.getId(), userInfoEntity.getUiTelphone());
                        continue;
                    }
                    log.error("======用户ID:{} 没有微信或企业微信id======", userInfoEntity.getId());
                }
            }
        }
吴泽佳's avatar
吴泽佳 committed
202
    }
203 204

    public List<DaySubjectEntity> getDaySubList(String today) {
吴泽佳's avatar
吴泽佳 committed
205 206 207 208
        //查询今日早报 已上架
        LambdaQueryWrapper<DaySubjectEntity> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(DaySubjectEntity::getDeletetag, BizStatus.DeleteTag.tag_init_str)
                .eq(DaySubjectEntity::getDsDate, today)
吴泽佳's avatar
吴泽佳 committed
209
                .le(DaySubjectEntity::getDsTaskuptime, new Date())
吴泽佳's avatar
吴泽佳 committed
210
                .eq(DaySubjectEntity::getDsStatus, "1");
吴泽佳's avatar
吴泽佳 committed
211 212 213 214 215 216 217 218 219
        List<DaySubjectEntity> daySubjectEntities = daySubjectMapper.selectList(queryWrapper);
        List<DaySubjectEntity> daySubjectEntityList = daySubjectEntities.stream().filter(daySubjectEntity -> {
            // 过滤掉 早报下没有文章的
            List<DaySelection> daySelections = daySelectionMapper.selectList(new LambdaQueryWrapper<DaySelection>()
                    .eq(DaySelection::getDsSubjectId, daySubjectEntity.getId())
                    .eq(DaySelection::getDeletetag, BizStatus.DeleteTag.tag_init_str));
            return CollectionUtils.isNotEmpty(daySelections);
        }).collect(Collectors.toList());
        return daySubjectEntityList;
吴泽佳's avatar
吴泽佳 committed
220 221
    }

222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
    public List<DaySubjectEntity> getDaySubject(String date, String orgId) {
        LambdaQueryWrapper<DaySubjectEntity> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(DaySubjectEntity::getDeletetag, BizStatus.DeleteTag.tag_init_str)
                .eq(DaySubjectEntity::getDsDate, DateUtil.parseDate(date))
                .eq(DaySubjectEntity::getDsPt, orgId)
                .eq(DaySubjectEntity::getDsStatus, "1");
        return daySubjectMapper.selectList(queryWrapper);
    }

    public String getOneMorningTitle() {
        int size = morningPaperProperties.getMainTitles().size();
        return morningPaperProperties.getMainTitles().get(RandomUtil.randomInt(0, size));
    }

    private String getShortUrl(String url) {
        ShorterResp resp = shorterFeign.getShorter(url);
        if (resp.isNotSuccess()) {
            return null;
        }
        return String.valueOf(resp.getResult());
    }

吴泽佳's avatar
吴泽佳 committed
244 245 246 247 248 249

    public static void main(String[] args) throws Exception {
        log.info("=========================");
    }

}