LogPushRunner.java 3.44 KB
package vion.cron;

import cn.hutool.core.lang.Opt;
import cn.hutool.core.util.ObjUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.hutool.core.date.DateUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.cron.CronUtil;
import org.dromara.hutool.cron.task.Task;
import org.dromara.hutool.json.JSONObject;
import org.dromara.hutool.json.JSONUtil;
import org.redisson.api.RedissonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import vion.constant.RedisKeyEnum;
import vion.model.RStoreUser;
import vion.model.Store;
import vion.model.User;
import vion.service.IRStoreUserService;
import vion.service.IStoreService;
import vion.third.DingMod;

import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author HlQ
 * @date 2024/4/23
 */
@Component
@RequiredArgsConstructor
@Slf4j
public class LogPushRunner {

    private final IStoreService storeService;
    private final IRStoreUserService storeUserService;
    private final DingMod dingMod;
    private final RedissonClient redissonClient;

    @Bean
    public void scheduledPush() {
        var storeList = storeService.lambdaQuery().isNotNull(Store::getCronStr).list();
        Opt.ofEmptyAble(storeList)
                .ifPresent(list -> {
                    var idList = list.stream().map(Store::getId).toList();
                    var storeUserMap = storeUserService.lambdaQuery()
                            .in(RStoreUser::getStoreId, idList).list()
                            .stream()
                            .filter(v -> v.getIsMain().equals(1))
                            .collect(Collectors.toMap(RStoreUser::getStoreId, RStoreUser::getUserId));

                    for (Store store : list) {
                        var task = getTask(store, storeUserMap);
                        CronUtil.schedule(store.getCronStr(), task);
                    }
                    if (!CronUtil.getScheduler().isStarted()) {
                        CronUtil.setMatchSecond(true);
                        CronUtil.start();
                    }
                });
    }

    public Task getTask(Store store, Map<Long, Long> storeUserMap) {
        return () -> {
            var userId = storeUserMap.get(store.getId());
            if (ObjUtil.isNull(userId)) {
                log.info("storeId:{},该项目未设置项目经理,不发送日志提醒", store.getId());
                return;
            }
            var user = (User) redissonClient.getBucket(RedisKeyEnum.DING_PREFIX.getVal() + RedisKeyEnum.USER_ID.getVal() + userId).get();
            dingMod.workMsg(buildMsg(store.getName(), user.getUserid()));
            log.info("storeId:{},项目发送日志提醒,提醒人:{}({})", store.getId(), user.getUsername(), user.getUserid());
        };
    }

    JSONObject buildMsg(String storeName, String userid) {
        var jsonObj = JSONUtil.ofObj()
                .set("agent_id", 2358374016L)
                .set("userid_list", userid);

        var msg = new JSONObject();
        var content = new JSONObject();
        content.set("title", "项目日志提醒")
                .set("text", StrUtil.format("""
                        #### 项目:[{}]请及时提交日志
                        #### 发送时间:{}""", storeName, DateUtil.now()));

        msg.set("msgtype", "markdown").set("markdown", content);
        jsonObj.set("msg", msg);
        return jsonObj;
    }
}