FollowTaskDealTask.java 5.23 KB
package cn.fw.valhalla.controller.task;

import cn.fw.valhalla.common.utils.DateUtil;
import cn.fw.valhalla.domain.db.follow.FollowTask;
import cn.fw.valhalla.domain.enums.ApproveTypeEnum;
import cn.fw.valhalla.domain.enums.FollowTypeEnum;
import cn.fw.valhalla.domain.enums.TaskStateEnum;
import cn.fw.valhalla.service.bus.cust.CustomerBizService;
import cn.fw.valhalla.service.bus.cust.CustomerChangeBizService;
import cn.fw.valhalla.service.bus.follow.FollowBizService;
import cn.fw.valhalla.service.data.FollowTaskService;
import cn.fw.valhalla.service.event.CancelApproveEvent;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

import static cn.fw.valhalla.common.utils.DateUtil.getNowExpiredDay;

/**
 * @author : kurisu
 * @className : FollowTask
 * @description : 跟进任务处理
 * @date: 2020-08-24 16:32
 */
@Component
@ConditionalOnProperty(prefix = "task", name = "switch", havingValue = "on")
public class FollowTaskDealTask {
    private final FollowTaskService followTaskService;
    private final FollowBizService followBizService;
    private final CustomerChangeBizService customerChangeBizService;
    private final CustomerBizService customerBizService;
    private final ApplicationEventPublisher eventPublisher;

    @Autowired
    public FollowTaskDealTask(final FollowTaskService followTaskService,
                              final FollowBizService followBizService,
                              final CustomerChangeBizService customerChangeBizService,
                              final CustomerBizService customerBizService,
                              final ApplicationEventPublisher eventPublisher) {
        this.followTaskService = followTaskService;
        this.followBizService = followBizService;
        this.customerChangeBizService = customerChangeBizService;
        this.customerBizService = customerBizService;
        this.eventPublisher = eventPublisher;
    }

    /**
     * 开始任务
     */
    @Scheduled(initialDelay = 1000 * 10, fixedRate = 1000 * 30)
    @Transactional(rollbackFor = Exception.class)
    public void startTask() {
        List<FollowTask> list = followTaskService.list(Wrappers.<FollowTask>lambdaQuery()
                .eq(FollowTask::getState, TaskStateEnum.WAITING)
                .ge(FollowTask::getBeginTime, DateUtil.startDate(getNowExpiredDay(-7)))
                .le(FollowTask::getBeginTime, DateUtil.localDateTime2Date(LocalDateTime.now()))
                .eq(FollowTask::getFinished, Boolean.FALSE)
                .last("limit 0, 500")
        );
        if (CollectionUtils.isEmpty(list)) {
            return;
        }
        for (FollowTask task : list) {
            Long userId = followBizService.createTaskRecord(task);
            if (Objects.nonNull(userId)) {
                task.setState(TaskStateEnum.ONGOING);
                task.setOriginUser(userId);
            }
        }
        followTaskService.updateBatchById(list);
    }

    /**
     * 结束任务
     */
    @Scheduled(initialDelay = 1000 * 30, fixedRate = 1000 * 60)
    @Transactional(rollbackFor = Exception.class)
    public void endTask() {
        List<FollowTask> list = followTaskService.list(Wrappers.<FollowTask>lambdaQuery()
                .eq(FollowTask::getState, TaskStateEnum.ONGOING)
                .le(FollowTask::getDeadline, DateUtil.localDateTime2Date(LocalDateTime.now()))
                .eq(FollowTask::getFinished, Boolean.FALSE)
        );
        if (CollectionUtils.isEmpty(list)) {
            return;
        }
        for (FollowTask r : list) {
            r.setState(TaskStateEnum.END);
            customerBizService.abandon(r);
            CancelApproveEvent event = new CancelApproveEvent(r.getId(), ApproveTypeEnum.FOLLOW_DEFEAT);
            eventPublisher.publishEvent(event);
        }
        followTaskService.updateBatchById(list);
    }

    /**
     * 更换人员
     */
    @Scheduled(initialDelay = 1000 * 5, fixedRate = 1000 * 25)
    @Transactional(rollbackFor = Exception.class)
    public void changeFollowUser() {
        List<FollowTask> list = followTaskService.list(Wrappers.<FollowTask>lambdaQuery()
                .eq(FollowTask::getState, TaskStateEnum.ONGOING)
                .le(FollowTask::getChangeUserTime, DateUtil.localDateTime2Date(LocalDateTime.now()))
                .eq(FollowTask::getFinished, Boolean.FALSE)
                .eq(FollowTask::getChanged, Boolean.FALSE)
                .last("limit 0, 500")
        );
        if (CollectionUtils.isEmpty(list)) {
            return;
        }
        list.forEach(task -> {
            if (FollowTypeEnum.IR.equals(task.getType())) {
                customerChangeBizService.changeInsFollowUser(task, true);
            } else {
                customerChangeBizService.changeFollowUser(task, true);
            }
        });
    }
}