DocHelperService.java 10.1 KB
package com.pipihelper.project.feishu.service.doc;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.pipihelper.project.feishu.dto.AppConfig;
import com.pipihelper.project.feishu.dto.FeiShuConfig;
import com.pipihelper.project.feishu.dto.FeiShuCreateTaskDTO;
import com.pipihelper.project.feishu.dto.doc.DocDTO;
import com.pipihelper.project.feishu.dto.doc.FieldsDTO;
import com.pipihelper.project.feishu.dto.doc.PeopleDTO;
import com.pipihelper.project.feishu.dto.employee.FeiShuEmployeeDTO;
import com.pipihelper.project.feishu.dto.msg.ContentDTO;
import com.pipihelper.project.feishu.dto.msg.FeiShuBatchMsgDTO;
import com.pipihelper.project.feishu.service.FeiShuApiService;
import com.pipihelper.project.feishu.vo.CreateTaskVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * @author xiongjian
 * @date 2022/7/4
 */
@Service
@Slf4j
public class DocHelperService {

    @Autowired
    private FeiShuApiService feiShuApiService;

    @Resource
    private FeiShuConfig feiShuConfig;

    private final Cache<String, Map<String, String>> NAME_CACHE = Caffeine.newBuilder()
            .maximumSize(5)
            .expireAfterWrite(Duration.ofHours(2))
            .build();

    private final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

    private Map<String, String> getNameMap() {
        return NAME_CACHE.get("nameMap", map -> {
            List<FeiShuEmployeeDTO> feiShuEmployeeDTOList = feiShuApiService.getEmployeeList(feiShuConfig.getAnniversaryApp());
            HashMap<String, String> nameMap = new HashMap<>(feiShuEmployeeDTOList.size());
            for (FeiShuEmployeeDTO feiShuEmployeeDTO : feiShuEmployeeDTOList) {
                String key = feiShuEmployeeDTO.getSystemFields().getName();
                nameMap.put(key, feiShuEmployeeDTO.getUserId());
            }
            log.info("重建姓名-Id缓存, size: {}", nameMap.size());
            return nameMap;
        });
    }

    /**
     * 人员转换器
     */
    public void transferPeople() {
        String app = feiShuConfig.getAnniversaryApp();
        AppConfig appConfig = feiShuConfig.getAppConfigMap().get(app);
        List<DocDTO> docList = feiShuApiService.getTableRecords(appConfig.getTableId(), appConfig.getPeopleTableId(), app);

        for (DocDTO<FieldsDTO> docDTO : docList) {
            if (Objects.isNull(docDTO.getFields().getName())) {
                continue;
            }
            if (getNameMap().containsKey(docDTO.getFields().getName()) && CollectionUtils.isEmpty(docDTO.getFields().getPeople())) {
                List<PeopleDTO> list = new ArrayList<>();
                list.add(new PeopleDTO(getNameMap().get(docDTO.getFields().getName())));
                docDTO.getFields().setPeople(list);
                docDTO.getFields().setUserId(getNameMap().get(docDTO.getFields().getName()));
                docDTO.getFields().setUpdateTime(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
                docDTO.getFields().setToken("Bearer " + feiShuApiService.getTenantToken(app));
                feiShuApiService.updateTableRecords(appConfig.getTableId(), appConfig.getPeopleTableId(), docDTO.getRecordId(), app, docDTO);
            }
        }
    }

    /**
     * 通过表格创建任务
     */
    public void createTaskByTable() {
        String app = feiShuConfig.getAnniversaryApp();
        AppConfig appConfig = feiShuConfig.getAppConfigMap().get(app);
        List<DocDTO> docList = feiShuApiService.getTableRecords(appConfig.getTableId(), appConfig.getTaskTableId(), app);
        for (DocDTO<FieldsDTO> docDTO : docList) {
            if (docDTO.getFields() == null) {
                continue;
            }
            if (StringUtils.isBlank(docDTO.getFields().getTaskName())) {
                continue;
            }
            if (!"待创建".equals(docDTO.getFields().getStatues())) {
                continue;
            }
            if (StringUtils.isBlank(docDTO.getFields().getCollaborators())) {
                continue;
            }
            // 创建任务
            FeiShuCreateTaskDTO feiShuCreateTaskDTO = new FeiShuCreateTaskDTO();
            feiShuCreateTaskDTO.setSummary(docDTO.getFields().getTaskName());
            feiShuCreateTaskDTO.setDescription(docDTO.getFields().getTaskDescription());
            FeiShuCreateTaskDTO.Due due = new FeiShuCreateTaskDTO.Due();
            if (docDTO.getFields().getDue() != null) {
                due.setTime(String.valueOf(docDTO.getFields().getDue()).substring(0, 10));
            }

            feiShuCreateTaskDTO.setDue(due);
            FeiShuCreateTaskDTO.OriginDTO originDTO = new FeiShuCreateTaskDTO.OriginDTO();
            originDTO.setPlatformI18nName(String.format("{\"zh_cn\": \"%s\"}", docDTO.getFields().getOrigin()));
            feiShuCreateTaskDTO.setOrigin(originDTO);

            // 执行者
            String[] collaborators = docDTO.getFields().getCollaborators().split(",|,");
            List<String> collaboratorIds = new ArrayList<>();
            for (String collaborator : collaborators) {
                if (getNameMap().containsKey(collaborator)) {
                    collaboratorIds.add(getNameMap().get(collaborator));
                }
            }
            feiShuCreateTaskDTO.setCollaboratorIds(collaboratorIds);

            // 关注者
            if (docDTO.getFields().getFollowers() != null) {
                String[] followers = docDTO.getFields().getFollowers().split(",|,");
                List<String> followerIds = new ArrayList<>();
                for (String follower : followers) {
                    if (getNameMap().containsKey(follower)) {
                        followerIds.add(getNameMap().get(follower));
                    }
                }
                feiShuCreateTaskDTO.setFollowerIds(followerIds);
            }


            try {
                // 创建任务
                feiShuApiService.createTask(feiShuCreateTaskDTO, null, app);
                // 发送消息
                sendMsg(docDTO);
                docDTO.getFields().setNote("成功");
            } catch (Exception e) {
                docDTO.getFields().setNote(e.getMessage());
            } finally {
                docDTO.getFields().setStatues("已创建");
                docDTO.getFields().setUpdateTime(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
                // 更新数据表
                feiShuApiService.updateTableRecords(appConfig.getTableId(), appConfig.getTaskTableId(), docDTO.getRecordId(), app, docDTO);
            }

        }

    }

    public void createTask(CreateTaskVo createTaskVo) {
        String app = feiShuConfig.getAnniversaryApp();
        // 创建任务
        FeiShuCreateTaskDTO feiShuCreateTaskDTO = new FeiShuCreateTaskDTO();
        feiShuCreateTaskDTO.setSummary(createTaskVo.getSummary());
        feiShuCreateTaskDTO.setDescription(createTaskVo.getDescription());

        FeiShuCreateTaskDTO.Due due = new FeiShuCreateTaskDTO.Due();
        ZoneId zone = ZoneId.systemDefault();
        if (StringUtils.isNotBlank(createTaskVo.getDueTime())) {
            // 截止时间有值按填值截止
            Long time = LocalDateTime.parse(createTaskVo.getDueTime(), DATE_TIME_FORMATTER).atZone(zone).toInstant().getEpochSecond();
            due.setTime(String.valueOf(time));
        } else {
            // 截止时间无值,按当天18点+偏移量截止
            LocalDateTime dateTime = LocalDateTime.of(LocalDate.now(), LocalTime.of(18, 0)).plusHours(createTaskVo.getDueTimeOffset());
            Long time = dateTime.atZone(zone).toInstant().getEpochSecond();
            due.setTime(String.valueOf(time));
        }
        feiShuCreateTaskDTO.setDue(due);

        FeiShuCreateTaskDTO.OriginDTO originDTO = new FeiShuCreateTaskDTO.OriginDTO();
        originDTO.setPlatformI18nName(String.format("{\"zh_cn\": \"%s\"}", app));
        feiShuCreateTaskDTO.setOrigin(originDTO);

        // 执行者
        if (StringUtils.isNotBlank(createTaskVo.getCollaboratorIds())){
            List<String> collaboratorIds = new ArrayList<>();
            for (String name : getNameMap().keySet()) {
                if (createTaskVo.getCollaboratorIds().contains(name)){
                    collaboratorIds.add(getNameMap().get(name));
                }
            }
            feiShuCreateTaskDTO.setCollaboratorIds(collaboratorIds);
        }

        // 关注者
        if (StringUtils.isNotBlank(createTaskVo.getFollowerIds())){
            List<String> followersIds = new ArrayList<>();
            for (String name : getNameMap().keySet()) {
                if (createTaskVo.getFollowerIds().contains(name)){
                    followersIds.add(getNameMap().get(name));
                }
            }
            feiShuCreateTaskDTO.setFollowerIds(followersIds);
        }

        // 创建任务
        feiShuApiService.createTask(feiShuCreateTaskDTO, null, app);
    }

    public void sendMsg(DocDTO<FieldsDTO> docDTO) {
        if (StringUtils.isBlank(docDTO.getFields().getMsg())) {
            return;
        }
        if (StringUtils.isBlank(docDTO.getFields().getReceiverIds())) {
            return;
        }
        FeiShuBatchMsgDTO feiShuBatchMsgDTO = new FeiShuBatchMsgDTO();
        feiShuBatchMsgDTO.setMsgType("text");
        feiShuBatchMsgDTO.setContent(new ContentDTO(docDTO.getFields().getMsg()));
        String[] receivers = docDTO.getFields().getReceiverIds().split(",|,");
        List<String> receiverIds = new ArrayList<>();
        for (String receiver : receivers) {
            if (getNameMap().containsKey(receiver)) {
                receiverIds.add(getNameMap().get(receiver));
            }
        }
        feiShuBatchMsgDTO.setOpenIds(receiverIds);
        // 发送消息
        feiShuApiService.sendBatchMsg(feiShuBatchMsgDTO, feiShuConfig.getAnniversaryApp());


    }

}