ACFollowStrategy.java 7.88 KB
package cn.fw.shirasawa.service.bus.follow.strategy.impl;

import cn.fw.common.util.ValidationUtils;
import cn.fw.shirasawa.common.utils.DateUtil;
import cn.fw.shirasawa.domain.db.OriginalData;
import cn.fw.shirasawa.domain.db.follow.FollowRecord;
import cn.fw.shirasawa.domain.db.follow.FollowRecordLog;
import cn.fw.shirasawa.domain.db.follow.FollowTask;
import cn.fw.shirasawa.domain.db.pool.CluePool;
import cn.fw.shirasawa.domain.dto.FollowAttachmentDTO;
import cn.fw.shirasawa.domain.enums.ClueStatusEnum;
import cn.fw.shirasawa.domain.enums.FollowTypeEnum;
import cn.fw.shirasawa.domain.enums.OutTimeEnum;
import cn.fw.shirasawa.domain.vo.follow.ACDetailVO;
import cn.fw.shirasawa.rpc.backlog.dto.BackLogItemDTO;
import cn.fw.shirasawa.rpc.valhalla.ValhallaRpcService;
import cn.fw.shirasawa.rpc.valhalla.dto.ValhallaCustomerDTO;
import cn.fw.shirasawa.service.bus.follow.strategy.AbstractFollowStrategy;
import cn.fw.shirasawa.service.event.RecordCompleteEvent;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

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

import static cn.fw.common.businessvalidator.Validator.BV;

/**
 * @author : kurisu
 * @className : ACFollowStrategy
 * @description : 事故车策略
 * @date: 2020-08-17 10:48
 */
@Slf4j
@Component
public class ACFollowStrategy extends AbstractFollowStrategy {

    @Value("${follow.todo.ACCode}")
    @Getter
    private String ACCode;
    private final ValhallaRpcService valhallaRpcService;

    @Autowired
    public ACFollowStrategy(final ValhallaRpcService valhallaRpcService) {
        this.valhallaRpcService = valhallaRpcService;
    }

    @Override
    public FollowTypeEnum getFollowType() {
        return FollowTypeEnum.AC;
    }

    @Override
    public String getTodoCode() {
        return getACCode();
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean origin2task(OriginalData originalData) throws Exception {
        List<CluePool> list = cluePoolService.list(Wrappers.<CluePool>lambdaQuery()
                .eq(CluePool::getClueType, getFollowType())
                .eq(CluePool::getPlateNo, originalData.getPlateNo())
                .eq(CluePool::getRefererId, originalData.getDetailId())
                .eq(CluePool::getGroupId, originalData.getGroupId())
                .in(CluePool::getClueStatus, ClueStatusEnum.ONGOING, ClueStatusEnum.WAITING)
        );
        if (!CollectionUtils.isEmpty(list)) {
            return true;
        }
        CluePool cluePool = transformClue(originalData);
        cluePool.setStartTime(originalData.getGenerateTime());
        LocalDateTime deadLine = Optional.ofNullable(originalData.getDeadline()).orElse(LocalDate.now().plusMonths(2L).atStartOfDay());
        cluePool.setDeadline(deadLine.minusSeconds(1L));
        cluePool.setBizId(originalData.getFrameNo());
        return cluePoolService.save(cluePool);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void startClue(CluePool cluePool) throws Exception {
        FollowTask task = this.createTask(cluePool);
        boolean saveTask = followTaskService.save(task);
        BV.isTrue(saveTask, () -> "生成跟进任务失败");
        FollowRecord record = createRecord(task);
        record.setNote(cluePool.getNote());
        record.setContacts(cluePool.getContacts());
        record.setCompelTel(ValidationUtils.checkMobile(cluePool.getContacts()));
        if (Objects.nonNull(cluePool.getFirstDeadline())) {
            record.setDeadline(cluePool.getFirstDeadline());
        }
        followRecordService.save(record);
        cluePool.setClueStatus(ClueStatusEnum.ONGOING);
        cluePoolService.updateById(cluePool);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void uploadAtt(FollowAttachmentDTO dto, FollowRecord record, Long userId) {
        if (Objects.isNull(record)) {
            return;
        }
        FollowTask task = followTaskService.getById(record.getTaskId());
        FollowRecordLog recordLog = new FollowRecordLog();
        recordLog.setId(dto.getId());
        recordLog.setTaskId(record.getTaskId());
        recordLog.setAttachments(dto.getAttachments());
        recordLog.setAttType(dto.getAttTypeEnum());
        recordLog.setFeedbackType(dto.getFeedbackTypeEnum());
        recordLog.setDescribes(dto.getDescribes());
        recordLog.setRecordId(dto.getRecordId());
        if (Objects.isNull(dto.getId())) {
            recordLog.setUploadTime(LocalDateTime.now());
        }
        followRecordLogService.save(recordLog);
        feedbackTask(record.getTaskId(), dto.getFeedbackTypeEnum());

        if (OutTimeEnum.ONGOING.equals(record.getOutTime()) && Objects.isNull(record.getFollowTime())) {
            record.setFollowTime(LocalDateTime.now());
            BackLogItemDTO backLogItemDTO = new BackLogItemDTO(record.getUserId(), record.getTodoCode(),
                    String.valueOf(record.getId()), DateUtil.toDate(LocalDateTime.now()), record.getShopId());


            record.setFollowTime(LocalDateTime.now());
            record.setOutTime(OutTimeEnum.BE_COMPLETE);
            if (Objects.nonNull(task)) {
                int times = task.getTimes() == null ? 0 : task.getTimes();
                task.setTimes(times + 1);
                followTaskService.updateById(task);
            }
            todoRpcService.complete(backLogItemDTO);
            followRecordService.updateById(record);
            eventPublisher.publishEvent(new RecordCompleteEvent(record, null));
        }
    }

    @Override
    public ACDetailVO queryDetail(FollowRecord record) {
        FollowTask followTask = followTaskService.getById(record.getTaskId());
        BV.notNull(followTask, "跟进任务不存在");
        CluePool cluePool = cluePoolService.getById(followTask.getClueId());
        BV.notNull(cluePool, "跟进线索不存在");
        ACDetailVO vo = new ACDetailVO();
        assembleRecordDetail(vo, record, cluePool);
        vo.setReportMobile(record.getContacts());
        vo.setPlateNo(record.getPlateNo());
        vo.setShopId(cluePool.getOriginalShopId());
        vo.setShopName(cluePool.getOriginalShopName());
        vo.setRecordingAttachment(!ValidationUtils.checkMobile(vo.getReportMobile()));
        vo.setTaskDeadline(followTask.getDeadline());
        vo.setVin(record.getBizId());
        ValhallaCustomerDTO dto = valhallaRpcService.queryByVin(record.getBizId(), record.getGroupId());
        if (Objects.nonNull(dto)) {
            vo.setCustomerId(dto.getId());
        }
        return vo;
    }

    @Override
    public ACDetailVO followPoolDetail(FollowTask task) {
        CluePool cluePool = cluePoolService.getById(task.getClueId());
        BV.notNull(cluePool, "跟进线索不存在");
        ACDetailVO vo = new ACDetailVO();
        vo.setReportMobile(cluePool.getContacts());
        vo.setPlateNo(cluePool.getPlateNo());
        vo.setMobile(cluePool.getContacts());
        vo.setRealMobile(cluePool.getContacts());
        vo.setCustomerId(cluePool.getCustomerId());
        vo.setCustomerName(cluePool.getCustomerName());
        vo.setVin(cluePool.getBizId());
        vo.setType(task.getType().getValue());
        vo.setBizType(cluePool.getBizType().getValue());
        vo.setTaskId(task.getId());
        vo.setDeadline(task.getDeadline());
        queryTimes(cluePool.getId(), vo);
        ValhallaCustomerDTO dto = valhallaRpcService.queryByVin(cluePool.getBizId(), cluePool.getGroupId());
        if (Objects.nonNull(dto)) {
            vo.setCustomerId(dto.getId());
        }
        return vo;
    }
}