CustomEventListener.java 4.33 KB
package cn.fw.shirasawa.service.bus;

import cn.fw.shirasawa.common.utils.DateUtil;
import cn.fw.shirasawa.component.RecordResultProducer;
import cn.fw.shirasawa.domain.db.ApproveRecord;
import cn.fw.shirasawa.domain.db.follow.FollowRecord;
import cn.fw.shirasawa.domain.db.follow.FollowTask;
import cn.fw.shirasawa.domain.db.pool.CluePool;
import cn.fw.shirasawa.domain.enums.ApproveStateEnum;
import cn.fw.shirasawa.domain.enums.ApproveTypeEnum;
import cn.fw.shirasawa.domain.enums.OutTimeEnum;
import cn.fw.shirasawa.rpc.flow.FlowApproveRpc;
import cn.fw.shirasawa.sdk.mq.FollowResultDTO;
import cn.fw.shirasawa.service.data.ApproveRecordService;
import cn.fw.shirasawa.service.data.CluePoolService;
import cn.fw.shirasawa.service.data.FollowRecordService;
import cn.fw.shirasawa.service.data.FollowTaskService;
import cn.fw.shirasawa.service.event.CancelApproveEvent;
import cn.fw.shirasawa.service.event.RecordCompleteEvent;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import java.util.Objects;

/**
 * @author : kurisu
 * @className : CustomEventListener
 * @description : 事件监听器
 * @date: 2020-08-18 16:28
 */
@Component
@Slf4j
@RequiredArgsConstructor
public class CustomEventListener {
    private final FollowTaskService followTaskService;
    private final ApproveRecordService approveRecordService;
    private final FlowApproveRpc flowApproveRpc;
    private final CluePoolService cluePoolService;
    private final FollowRecordService followRecordService;
    private final RecordResultProducer recordResultProducer;

    /**
     * 取消审批
     *
     * @param event
     */
    @EventListener(CancelApproveEvent.class)
    public void cancelApprove(final CancelApproveEvent event) {
        Long taskId = event.getTaskId();
        ApproveTypeEnum typeEnum = event.getTypeEnum();
        ApproveRecord approveRecord = approveRecordService.getOne(Wrappers.<ApproveRecord>lambdaQuery()
                .eq(ApproveRecord::getDataId, taskId)
                .eq(ApproveRecord::getType, typeEnum)
                .eq(ApproveRecord::getState, ApproveStateEnum.WAIT)
                .last("limit 1")
        );
        if (Objects.isNull(approveRecord)) {
            return;
        }
        //FIXME 优化项 处理审批取消失败的场景
        boolean canceled = flowApproveRpc.cancel(approveRecord.getOrderNo());
        approveRecord.setState(ApproveStateEnum.CANCELED);
        approveRecordService.updateById(approveRecord);
    }

    /**
     * 待办处理的时间
     */
    @EventListener(RecordCompleteEvent.class)
    public void onRecordComplete(final RecordCompleteEvent t) {
        try {
            FollowRecord record = t.getRecord();
            Long clueId = t.getClueId();
            if (Objects.isNull(clueId)) {
                Long taskId = record.getTaskId();
                FollowTask task = followTaskService.getById(taskId);
                if (Objects.nonNull(task)) {
                    clueId = task.getClueId();
                }
            }
            if (Objects.isNull(clueId)) {
                return;
            }
            CluePool cluePool = cluePoolService.getById(clueId);
            if (Objects.isNull(cluePool)) {
                return;
            }
            long remaining = followRecordService.recordRemaining(record.getUserId(), record.getBizType(), record.getId());
            FollowResultDTO dto = new FollowResultDTO();
            dto.setCustomerId(record.getCustomerId());
            dto.setRecordId(record.getId());
            dto.setType(record.getType().getValue());
            dto.setDetailId(cluePool.getRefererId());
            dto.setUserId(record.getUserId());
            dto.setUserName(record.getUserName());
            dto.setShopId(record.getShopId());
            dto.setGroupId(record.getGroupId());
            dto.setRemaining(remaining);
            boolean ov = OutTimeEnum.BE_OVERDUE.equals(record.getOutTime());
            dto.setOverdue(ov);
            dto.setResultTime(DateUtil.toDate(ov ? record.getDeadline().minusSeconds(1L) : record.getFollowTime()));
            recordResultProducer.send(dto);
        } catch (Exception ex) {
            log.error("RecordCompleteEvent处理失败", ex);
        }
    }
}