PoolBizService.java 9.96 KB
package cn.fw.shirasawa.service.bus.follow;

import cn.fw.common.page.AppPage;
import cn.fw.common.web.auth.LoginAuthBean;
import cn.fw.shirasawa.common.utils.DateUtil;
import cn.fw.shirasawa.common.utils.StringUtils;
import cn.fw.shirasawa.domain.dto.CluePoolDTO;
import cn.fw.shirasawa.domain.dto.FollowPoolDTO;
import cn.fw.shirasawa.domain.dto.FollowRecordPoolDTO;
import cn.fw.shirasawa.domain.dto.SecretReportHistoryDTO;
import cn.fw.shirasawa.domain.enums.*;
import cn.fw.shirasawa.domain.query.*;
import cn.fw.shirasawa.domain.vo.AppPageVO;
import cn.fw.shirasawa.domain.vo.SecretReportHistoryVO;
import cn.fw.shirasawa.domain.vo.pool.CluePoolVO;
import cn.fw.shirasawa.domain.vo.pool.FollowPoolListVO;
import cn.fw.shirasawa.domain.vo.pool.FollowRecordPoolVO;
import cn.fw.shirasawa.rpc.ehr.EhrRpcService;
import cn.fw.shirasawa.rpc.erp.dto.UserInfoDTO;
import cn.fw.shirasawa.rpc.member.MemberRpcService;
import cn.fw.shirasawa.rpc.oop.OopService;
import cn.fw.shirasawa.rpc.oop.dto.ShopDTO;
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.data.SecretReportHistoryService;
import cn.hutool.core.date.BetweenFormater;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.stream.Collectors;

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

/**
 * @author : kurisu
 * @className : FollowPoolBizService
 * @description : 跟进池服务
 * @date: 2020-09-23 15:30
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class PoolBizService {
    private final FollowTaskService followTaskService;
    private final CluePoolService cluePoolService;
    private final OopService oopService;
    private final MemberRpcService memberRpcService;
    private final SecretReportHistoryService secretReportHistoryService;
    private final FollowRecordService followRecordService;
    private final EhrRpcService ehrRpcService;


    /**
     * 跟进池
     *
     * @param queryVO
     * @return
     */
    public AppPage<FollowPoolListVO> followList(LoginAuthBean user, FollowPoolQueryVO queryVO) {
        prepareParams(user, queryVO);
        AppPageVO<FollowPoolListVO> page = AppPageVO.init(queryVO);
        final long total = followTaskService.followListCount(queryVO);
        if (total <= 0) {
            return page;
        }
        page.setTotal(total);
        List<FollowPoolDTO> list = followTaskService.followList(queryVO);
        List<FollowPoolListVO> followList = new ArrayList<>();
        for (FollowPoolDTO followPoolDTO : list) {
            FollowPoolListVO vo = trans2FollowPool(followPoolDTO);
            followList.add(vo);
        }
        page.setData(followList);
        return page;
    }


    /**
     * 客户线索池
     *
     * @param queryVO
     * @return
     */
    public AppPage<CluePoolVO> clueList(CluePoolQueryVO queryVO) {
        prepareParams(null, queryVO);
        BV.isNotEmpty(queryVO.getScope(), () -> "人员权限范围不正确,请确认是否有管理权限");
        if (ClueStatusEnum.ONGOING.getValue().equals(queryVO.getStatus())) {
            queryVO.setCloseTime(null);
        }
        AppPageVO<CluePoolVO> page = AppPageVO.init(queryVO);
        long total = cluePoolService.clueListCount(queryVO);
        if (total <= 0) {
            return page;
        }
        page.setTotal(total);
        final HashSet<Long> scope = new HashSet<>(queryVO.getScope());
        List<CluePoolDTO> list = cluePoolService.clueList(queryVO);
        List<CluePoolVO> appList = new ArrayList<>();
        for (CluePoolDTO dto : list) {
            CluePoolVO vo = trans2CluePool(dto, scope);
            appList.add(vo);
        }
        page.setData(appList);
        return page;
    }

    /**
     * 查询通话记录池
     *
     * @param query
     * @return
     */
    public AppPage<SecretReportHistoryVO> secretReportList(SecretReportHistoryQuery query) {
        BV.isNotEmpty(query.getShopIds(), () -> "人员权限范围不正确,请确认是否有管理权限");
        if (Objects.isNull(query.getOrder())) {
            query.setOrderString(" order by call_time asc ");
        }
        AppPageVO<SecretReportHistoryVO> page = AppPageVO.init(query);
        long total = secretReportHistoryService.secretReportCount(query);
        if (total <= 0) {
            return page;
        }
        page.setTotal(total);
        List<SecretReportHistoryDTO> list = secretReportHistoryService.secretReportList(query);
        List<SecretReportHistoryVO> appList = new ArrayList<>();
        for (SecretReportHistoryDTO dto : list) {
            SecretReportHistoryVO vo = new SecretReportHistoryVO();
            BeanUtils.copyProperties(dto, vo);
            vo.setShopName(Optional.ofNullable(oopService.shop(dto.getShopId())).map(ShopDTO::getShortName).orElse(null));
            vo.setCallType(CallTypeEnum.ofValue(dto.getDialType()));
            appList.add(vo);
        }
        page.setData(appList);
        return page;
    }

    /**
     * 跟进记录池
     *
     * @param query
     * @return
     */
    public AppPage<FollowRecordPoolVO> recordPoolList(LoginAuthBean user, FollowRecordPoolQuery query) {
        if (Boolean.TRUE.equals(query.getOwner())) {
            prepareParams(user, query);
        } else {
            prepareParams(null, query);
        }
        AppPageVO<FollowRecordPoolVO> page = AppPageVO.init(query);
        long total = followRecordService.recordPoolCount(query);
        if (total <= 0) {
            return page;
        }
        page.setTotal(total);
        List<FollowRecordPoolDTO> followRecordPoolList = followRecordService.recordPoolList(query);
        for (FollowRecordPoolDTO dto : followRecordPoolList) {
            trans2FollowRecordPool(dto);
        }
        List<FollowRecordPoolVO> voList = followRecordPoolList.stream().map(this::trans2FollowRecordPool).collect(Collectors.toList());
        page.setData(voList);
        return page;
    }


    private FollowPoolListVO trans2FollowPool(FollowPoolDTO poolDTO) {
        FollowPoolListVO vo = new FollowPoolListVO();
        BeanUtils.copyProperties(poolDTO, vo);
        vo.setFollower(poolDTO.getFollowUserName());
        if (StringUtils.isEmpty(poolDTO.getFollowUserName()) && Objects.nonNull(poolDTO.getUserId())) {
            UserInfoDTO user = ehrRpcService.user(poolDTO.getUserId());
            if (Objects.nonNull(user)) {
                vo.setFollower(user.getUserName());
            }
        }
        if (Objects.nonNull(poolDTO.getShopId())) {
            ShopDTO shop = oopService.shop(poolDTO.getShopId());
            if (Objects.nonNull(shop)) {
                vo.setShopName(shop.getShortName());
            }
        }
        if (Objects.nonNull(poolDTO.getFinishShop())) {
            ShopDTO fshop = oopService.shop(poolDTO.getFinishShop());
            if (Objects.nonNull(fshop)) {
                vo.setFinishShopName(fshop.getShortName());
            }
        }

        TaskDefeatTypeEnum defeatTypeEnum = TaskDefeatTypeEnum.ofValue(poolDTO.getInitiative());
        if (Objects.nonNull(defeatTypeEnum)) {
            vo.setDefeatType(defeatTypeEnum.getName());
        }
        FeedbackTypeEnum feedbackTypeEnum = FeedbackTypeEnum.ofValue(poolDTO.getFeedback());
        if (Objects.nonNull(feedbackTypeEnum)) {
            vo.setFeedback(feedbackTypeEnum.getName());
        }
        return vo;
    }


    private CluePoolVO trans2CluePool(CluePoolDTO poolDTO, Set<Long> scope) {
        CluePoolVO vo = new CluePoolVO();
        BeanUtils.copyProperties(poolDTO, vo);
        vo.setStatus(poolDTO.getClueStatus());

        if (ClueStatusEnum.COMPLETE.getValue().equals(poolDTO.getClueStatus()) && scope.contains(poolDTO.getFinishShopId())) {
            vo.setStatus(ClueStatusEnum.COMPLETE.getValue());
        }
        boolean bool = ClueStatusEnum.FAILURE.getValue().equals(poolDTO.getClueStatus()) ||
                (Objects.nonNull(poolDTO.getFinishShopId()) && !scope.contains(poolDTO.getFinishShopId()));
        if (bool) {
            vo.setStatus(ClueStatusEnum.FAILURE.getValue());
        }
        return vo;
    }

    private FollowRecordPoolVO trans2FollowRecordPool(FollowRecordPoolDTO poolDTO) {
        FollowRecordPoolVO vo = new FollowRecordPoolVO();
        BeanUtils.copyProperties(poolDTO, vo);
        if (Objects.nonNull(poolDTO.getRemaining())) {
            vo.setConsuming(DateUtil.formatBetween(poolDTO.getRemaining() * 1000L, BetweenFormater.Level.MINUTE));
        }
        if (!CollectionUtils.isEmpty(poolDTO.getAttType())) {
            Set<String> followModeSet = new HashSet<>();
            for (Integer str : poolDTO.getAttType()) {
                AttTypeEnum typeEnum = AttTypeEnum.ofValue(str);
                if (Objects.nonNull(typeEnum)) {
                    followModeSet.add(typeEnum.getName());
                }
            }
            vo.setFollowMode(String.join(",", followModeSet));
        }
        vo.setRegion(memberRpcService.attribution(poolDTO.getMobile()));
        ShopDTO shop = oopService.shop(poolDTO.getShopId());
        if (Objects.nonNull(shop)) {
            vo.setShopName(shop.getShortName());
        }
        return vo;
    }

    private void prepareParams(LoginAuthBean user, PoolQuery queryVO) {
        if (Objects.nonNull(user)) {
            queryVO.setUserId(user.getUserId());
            queryVO.setGroupId(user.getGroupId());
        }
        if (Objects.nonNull(queryVO.getOrder()) && StringUtils.isValid(queryVO.getOrderAtt())) {
            StringBuilder sb = new StringBuilder(" order by ");
            sb.append(StringUtils.toColumnName(queryVO.getOrderAtt()).toLowerCase());
            if (queryVO.getOrder() == 1) {
                sb.append(" asc ");
            } else {
                sb.append(" desc ");
            }
            queryVO.setOrderString(sb.toString());
        }
    }
}