MassageNoticeScheduleService.java 7.71 KB
package com.pipihelper.project.scheduled;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.pipihelper.project.feishu.bo.PushPainBO;
import com.pipihelper.project.feishu.dto.FeiShuConfig;
import com.pipihelper.project.feishu.dto.chat.FeiShuChatDTO;
import com.pipihelper.project.feishu.dto.department.FeiShuDepartmentDTO;
import com.pipihelper.project.feishu.entity.Employee;
import com.pipihelper.project.feishu.entity.LastMaxPain;
import com.pipihelper.project.feishu.entity.Pain;
import com.pipihelper.project.feishu.service.EmployeeService;
import com.pipihelper.project.feishu.service.FeiShuApiService;
import com.pipihelper.project.feishu.service.LastMaxPainService;
import com.pipihelper.project.feishu.service.PainService;
import com.pipihelper.project.feishu.service.massage.MassageService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

/**
 * @Description: TODO
 * @author: charles
 * @date: 2022年10月15日 17:26
 */
@Slf4j
@Component
public class MassageNoticeScheduleService {


    @Autowired
    private PainService painService;

    @Autowired
    private MassageService massageService;

    @Autowired
    private FeiShuApiService feiShuApiService;
    @Autowired
    private EmployeeService employeeService;
    @Autowired
    private LastMaxPainService lastMaxPainService;
    @Resource
    private FeiShuConfig feiShuConfig;

    private final static Map<Integer, Integer> floorCountMap = new HashMap<>();

    static {
        floorCountMap.put(8, 10);
        floorCountMap.put(14, 30);
    }

    /**
     * 每周四定时生成要按摩的人员名单,并发送大群和单人消息
     */
    @Async
    @Scheduled(cron = "0 0 10 * * ?")
    public void sendMsgCardToPipiChat() {
        employeeService.uprsetAllEmployee();

        for (Integer floor : Lists.newArrayList(14)) {
            LastMaxPain maxPain = lastMaxPainService.findByFloor(floor);
            int startEmployeeId = 0;
            if (maxPain != null) {
                startEmployeeId = maxPain.getEmployeeId();
            }
            int countByFloor = employeeService.findCountByFloor(floor);
            int limit = floorCountMap.get(floor);
            if (countByFloor < limit) {
                limit = countByFloor;
            }
            List<Employee> employeeList = employeeService.findStartList(startEmployeeId, floor, limit);
            Integer maxEmploeeId;
            if (employeeList.size() == limit) {
                maxEmploeeId = employeeList.stream().map(Employee::getId).max(Comparator.comparing(x -> x)).orElse(0);
            } else {
                List<Employee> employees = employeeService.findStartList(0, floor, limit - employeeList.size());
                maxEmploeeId = employees.stream().map(Employee::getId).max(Comparator.comparing(x -> x)).orElse(0);
                employeeList.addAll(employees);
            }

            Map<String, FeiShuDepartmentDTO> departmentMap = new HashMap<>();
            List<String> departmentIdList = employeeList.stream().map(Employee::getDepartmentId).distinct().collect(Collectors.toList());
            departmentIdList.forEach(it -> {
                FeiShuDepartmentDTO department = feiShuApiService.getDepartment(it);
                departmentMap.put(it, department);
            });

            painService.deleteAllByFloor(floor);

            if (CollectionUtil.isEmpty(employeeList)) {
                return;
            }
            List<PushPainBO> pushPainBOList = new ArrayList<>();
            String[] userIdList = new String[employeeList.size()];
            AtomicInteger i = new AtomicInteger(1);
            employeeList.forEach(it -> {
                Pain pain = new Pain();
                pain.setOpenId(it.getOpenId());
                pain.setStatus(0);
                pain.setFloor(Optional.ofNullable(it.getFloor()).orElse(floor));
                int increment = i.getAndIncrement();
                pain.setPindex(increment);
                pain.setName(it.getName());
                String departMentName = departmentMap.getOrDefault(it.getDepartmentId(), new FeiShuDepartmentDTO()).getName();
                pain.setDepartMentName(departMentName);
                painService.create(pain);

                PushPainBO pushPainBO = new PushPainBO();
                pushPainBO.setIndex(increment);
                pushPainBO.setName(it.getName());
                pushPainBO.setDepartMentName(departMentName);
                pushPainBO.setOpenId(it.getOpenId());
                pushPainBO.setTimeRange(painService.getTimeRange(increment, floor));
                pushPainBOList.add(pushPainBO);
                userIdList[increment - 1] = it.getOpenId();
            });

            FeiShuChatDTO feiShuChatDTO = new FeiShuChatDTO();
            feiShuChatDTO.setName("按摩群 " + DateUtil.today());
            feiShuChatDTO.setOwnerId(pushPainBOList.get(0).getOpenId());
            feiShuChatDTO.setUserIdList(userIdList);
            String chatId = feiShuApiService.createChatList(feiShuChatDTO);
            massageService.sendMassageMsgCardToPiPiChat(pushPainBOList, chatId);
            massageService.sendMassageMsgCardToPiPiChat(pushPainBOList, feiShuConfig.getChatId());

            if (maxPain != null) {
                maxPain.setEmployeeId(maxEmploeeId);
                lastMaxPainService.update(maxPain);
            } else {
                maxPain = new LastMaxPain();
                maxPain.setEmployeeId(maxEmploeeId);
                maxPain.setFloor(floor);
                lastMaxPainService.create(maxPain);
            }
        }
    }


    /**
     * 当天时间2:55,给第一波三个人更新卡片,并发送应用内提醒
     */
//    @Async
//    @Scheduled(cron = "0 0 10 * * ?")
    public void massageStart() {
        List<Pain> pains = painService.findListAsc(3);
        for (Pain pain : pains) {
            String messageId = pain.getMessageId();
            massageService.updateSingleMassageMsgCardWhenBegin(messageId);
            //1代表正在按
            pain.setStatus(1);
            painService.update(pain);
            JSONObject noticeMsg = new JSONObject();
            noticeMsg.put("user_id_list", Arrays.asList(pain.getOpenId()));
            //发送应用内提醒
            log.info("发送应用内容消息提醒");
            feiShuApiService.patchUrgentApp(messageId, noticeMsg);
        }

    }


//    /**
//     * 当天时间2:55,给第一波三个人更新卡片,并发送应用内提醒
//     */
//    @Async
//    @Scheduled(cron = "0 0 10 * * ?")
//    public void massageStart(){
//        List<Pain> pains = painService.findListAsc(3);
//        for(Pain pain:pains){
//            String messageId = pain.getMessageId();
//            massageService.updateSingleMassageMsgCardWhenBegin(messageId);
//            //1代表正在按
//            pain.setStatus(1);
//            painService.update(pain);
//            JSONObject noticeMsg = new JSONObject();
//            noticeMsg.put("user_id_list", Arrays.asList(pain.getOpenId()));
//            //发送应用内提醒
//            log.info("发送应用内容消息提醒");
//            feiShuApiService.patchUrgentApp(messageId, noticeMsg);
//        }
//
//    }
}