BigViewServiceImpl.java 15.3 KB
package com.ruoyi.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.ruoyi.common.cache.NowSchedulingCache;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.domain.DriverScheduling;
import com.ruoyi.driver.mapper.DriverMapper;
import com.ruoyi.driver.mapper.DriverSchedulingMapper;
import com.ruoyi.in.service.ISignInService;
import com.ruoyi.pojo.response.SignInResponseVo;
import com.ruoyi.pojo.vo.bigViewVo.FleetInfoVo;
import com.ruoyi.pojo.vo.bigViewVo.LineInfo;
import com.ruoyi.pojo.vo.bigViewVo.SignInfoVo;
import com.ruoyi.service.BigViewService;
import com.ruoyi.service.ThreadJobService;
import com.ruoyi.utils.ConstDateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_OUT;
import static com.ruoyi.common.ConstSignInConstSignInProperties.*;
import static com.ruoyi.common.SignStatusEnum.*;

/**
 * @author 20412
 */
@Service
public class BigViewServiceImpl implements BigViewService {

    private static final Logger log = LoggerFactory.getLogger(BigViewServiceImpl.class);

    @Resource
    private ThreadJobService threadJobService;
    @Autowired
    private DriverSchedulingMapper schedulingMapper;

    @Autowired
    private ISignInService iSignInService;

    @Autowired
    private DriverMapper driverMapper;

    @Resource
    private NowSchedulingCache cache;

    @Override
    public Integer queryNumberByType(String type, String dateKey) {
        Integer x = handleType(type, dateKey);
        if (x != null) return x;
        return 0;
    }

    @Override
    public List<FleetInfoVo> queryFleetInfoByFleetName(String dateKey) {
        // 从缓存中读取数据,但是调度表中还好包含飞司售人员信息  需要过滤一下  非司售人员nbbm不会存在
        String key = dateKey.replaceAll("-", "");
        Map<String, List<DriverScheduling>> map = cache.getCacheScheduling(key);

        Map<String, LineInfo> matchMap = transformMapByMacheList(map);
        // 车队和线路 车队为key
        Map<String, Map<String, List<String>>> mapVo = new HashMap<>(4);

        // 记录所有得签到数据  以车队 -》 线路 -》 人员信息 层次
        handleFleetWithLine(map, mapVo);
        // 进一步处理人员信息
        List<FleetInfoVo> fleetInfoVos = handleFleetWithLinePersonInfo(matchMap, mapVo);
        return fleetInfoVos;
    }

    @Override
    public SignInfoVo querySignDetails(String date, String jobCode) {
        SignInfoVo vo = null;
        Map<String, List<DriverScheduling>> map = cache.getCacheScheduling(date.replaceAll("-", ""));
        List<DriverScheduling> list = map.get(jobCode);
        if (CollectionUtil.isNotEmpty(list)) {
            vo = new SignInfoVo();
            vo.setName(list.get(0).getName());
            vo.setJobCode(jobCode);
            vo.setFleetName(list.get(0).getFleetName());
            vo.setSignInfos(new ArrayList<>());
            list = list.stream().filter(item -> BC_TYPE_OUT.equals(item.getBcType())).collect(Collectors.toList());
            List<SignInResponseVo> signInList = iSignInService.selectSignInByIds(list.stream().map(DriverScheduling::getSignInId).filter(item -> !Objects.isNull(item)).collect(Collectors.toList()));
            Map<String, Object> lpNameMap = new HashMap<>(list.size());
            for (DriverScheduling scheduling : list) {
                lpNameMap.put(scheduling.getLpName(), "");
                SignInfoVo.SignInfo info = new SignInfoVo.SignInfo();
                info.setPlanDate(new Date(scheduling.getFcsjT()));
                info.setSignDate(scheduling.getSignTime());
                for (SignInResponseVo sign : signInList) {
                    if (sign.getId().equals(scheduling.getId())) {
                        info.setAddress(sign.getAddress());
                    }
                }
                info.setResult(Objects.isNull(scheduling.getRemark()) ? "未签" : scheduling.getRemark());
                vo.getSignInfos().add(info);
            }
            vo.setLpName(StringUtils.join(lpNameMap.keySet(), "/"));
        }
        return vo;
    }

    private List<FleetInfoVo> handleFleetWithLinePersonInfo(Map<String, LineInfo> map, Map<String, Map<String, List<String>>> mapVo) {
        List<FleetInfoVo> vos = new ArrayList<>(4);
        for (Map.Entry<String, Map<String, List<String>>> entry : mapVo.entrySet()) {
            Map<String, List<String>> value = entry.getValue();
            String fleetName = entry.getKey();
            FleetInfoVo vo = new FleetInfoVo();
            vo.setTitle(fleetName);
            vo.setFleetInfos(handleLineInfos(value, map));
            vos.add(vo);
        }

        return vos;
    }

    /**
     * 信息拼接
     *
     * @param value
     * @param map
     * @return
     */
    private List<FleetInfoVo.FleetInfo> handleLineInfos(Map<String, List<String>> value, Map<String, LineInfo> map) {
        List<FleetInfoVo.FleetInfo> fleetInfos = new ArrayList<>();
        for (Map.Entry<String, List<String>> entry : value.entrySet()) {
            String lineName = entry.getKey();
            List<String> nbbms = entry.getValue();
            FleetInfoVo.FleetInfo fleetInfo = new FleetInfoVo.FleetInfo();
            fleetInfo.setLineName(lineName);
            List<LineInfo> lineInfos = new ArrayList<>();
            for (String nbbm : nbbms) {
                LineInfo info = map.get(nbbm);
                lineInfos.add(info);
            }
            lineInfos.sort(Comparator.comparing(LineInfo::getNbbm).reversed());
            fleetInfo.setLineInfos(lineInfos);
            fleetInfos.add(fleetInfo);
        }
        return fleetInfos;
    }

    /**
     * 设置车队和线路 以车队为key
     */
    private void handleFleetWithLine(Map<String, List<DriverScheduling>> map, Map<String, Map<String, List<String>>> mapVo) {
        // 整合车队
        for (Map.Entry<String, List<DriverScheduling>> entry : map.entrySet()) {
            // 过滤进场   系统设置出场为签到  进场为签退
            List<DriverScheduling> value = entry.getValue().stream().filter(item -> BC_TYPE_OUT.equals(item.getBcType()) && !Objects.isNull(item.getNbbm())).collect(Collectors.toList());
            if (CollectionUtil.isNotEmpty(value)) {
                String fleetName = value.get(0).getFleetName();
                Map<String, List<String>> distinctMap = mapVo.get(fleetName);
                if (CollectionUtil.isEmpty(distinctMap)) {
                    distinctMap = new HashMap<>(value.size());
                    //  线路去重
                    for (DriverScheduling scheduling : value) {
                        handleDistinctMap(distinctMap, scheduling);
                    }
                    // 把线路和自编号放入集合
                    mapVo.put(fleetName, distinctMap);
                } else {
                    for (DriverScheduling scheduling : value) {
                        handleDistinctMap(distinctMap, scheduling);
                    }
                    mapVo.put(fleetName, distinctMap);
                }
            }
        }
        // 对自编号进行去重
        for (Map.Entry<String, Map<String, List<String>>> entry : mapVo.entrySet()) {
            Map<String, List<String>> value = entry.getValue();
            for (Map.Entry<String, List<String>> listEntry : value.entrySet()) {
                listEntry.setValue(listEntry.getValue().stream().distinct().collect(Collectors.toList()));
            }
        }
    }

    private void handleDistinctMap(Map<String, List<String>> distinctMap, DriverScheduling scheduling) {
        List<String> distinct = distinctMap.get(scheduling.getLineName());
        if (CollectionUtil.isEmpty(distinct)) {
            distinctMap.put(scheduling.getLineName(), new ArrayList<>(Arrays.asList(scheduling.getNbbm())));
        } else {
            distinct.add(scheduling.getNbbm());
        }
    }


    /**
     * 自编号为key 存储人员信息
     *
     * @param map
     * @return
     */
    private Map<String, LineInfo> transformMapByMacheList(Map<String, List<DriverScheduling>> map) {
        Map<String, LineInfo> matchMap = new HashMap<>();
        for (Map.Entry<String, List<DriverScheduling>> entry : map.entrySet()) {
            List<DriverScheduling> value = entry.getValue();
            List<DriverScheduling> list = value.stream().filter(item -> BC_TYPE_OUT.equals(item.getBcType()) && !Objects.isNull(item.getNbbm())).sorted(Comparator.comparing(DriverScheduling::getFcsjT)).collect(Collectors.toList());
            for (DriverScheduling scheduling : list) {
                // 把每辆车的人员信息收集起来
                String nbbm = scheduling.getNbbm();
                LineInfo lineInfoList = matchMap.get(nbbm);
                if (Objects.isNull(lineInfoList)) {
                    LineInfo lineInfo = new LineInfo();
                    lineInfo.setNbbm(nbbm);
                    LineInfo.PersonInfoVo personInfoVo = getPersonInfoVo(scheduling);
                    if (DRIVER_STRING.equals(scheduling.getPosts())) {
                        lineInfo.setDriverInfoVo(personInfoVo);
                    } else {
                        lineInfo.setSaleInfoVo(personInfoVo);
                    }
                    matchMap.put(nbbm, lineInfo);
                } else {
                    LineInfo.PersonInfoVo personInfoVo = getPersonInfoVo(scheduling);
                    handleMoreStatus(matchMap, scheduling, nbbm, personInfoVo, scheduling);
                }
            }
        }
        return matchMap;
    }

    /**
     * 判断是否有多次签到,且签到时间未到
     *
     * @param matchMap
     * @param scheduling
     * @param nbbm
     * @param personInfoVo
     * @param driverScheduling
     */
    private void handleMoreStatus(Map<String, LineInfo> matchMap, DriverScheduling scheduling, String nbbm, LineInfo.PersonInfoVo personInfoVo, DriverScheduling driverScheduling) {
        // TODO 判断多异常
        long time = System.currentTimeMillis();
        if (DRIVER_STRING.equals(scheduling.getPosts())) {
            LineInfo.PersonInfoVo driverInfoVo = matchMap.get(nbbm).getDriverInfoVo();
            if (!Objects.isNull(driverInfoVo)) {
                // 第二次签到时间未到不记录状态
                if (time - scheduling.getFcsjT() < 0) {
                    return;
                }
                //   如有多异常覆盖策略 异常等级排 未签 -》 迟到 -》 酒驾
                if (driverInfoVo.getSignStatus().compareTo(personInfoVo.getSignStatus()) < 0) {
                    return;
                }
            }
            matchMap.get(nbbm).setDriverInfoVo(personInfoVo);
        } else {
            LineInfo.PersonInfoVo saleInfoVo = matchMap.get(nbbm).getSaleInfoVo();
            if (!Objects.isNull(saleInfoVo)) {
                // 第二次签到时间未到不记录状态
                if (time - scheduling.getFcsjT() < 0) {
                    return;
                }
                //   如有多异常覆盖策略 异常等级排 未签 -》 迟到 -》 酒驾
                if (saleInfoVo.getSignStatus().compareTo(personInfoVo.getSignStatus()) < 0) {
                    return;
                }
            }
            matchMap.get(nbbm).setSaleInfoVo(personInfoVo);
        }
    }

    private LineInfo.PersonInfoVo getPersonInfoVo(DriverScheduling scheduling) {
        LineInfo.PersonInfoVo personInfoVo = new LineInfo.PersonInfoVo();
        if (Objects.isNull(scheduling.getExType())) {
            personInfoVo.setSignStatus(SIGN_STATUS_EMPTY_ENUM);
        } else {
            switch (scheduling.getExType()) {
                case 0:
                    personInfoVo.setSignStatus(SIGN_STATUS_ZONE_ENUM);
                    break;
                case 1:
                    // 不在规定范围内  早签不算迟到
                    if (EARLY.equals(scheduling.getRemark())) {
                        personInfoVo.setSignStatus(SIGN_STATUS_ZONE_ENUM);
                    } else {
                        personInfoVo.setSignStatus(SIGN_STATUS_DELAY_ENUM);
                    }
                    break;
                case 3:
                    personInfoVo.setSignStatus(SIGN_STATUS_WINE_ENUM);
                    break;
            }
        }
        personInfoVo.setJobCode(scheduling.getJobCode());
        personInfoVo.setName(scheduling.getName());
        return personInfoVo;
    }

    private Integer handleType(String type, String dateKey) {
        String key = dateKey.replaceAll("-", "");
        Map<String, List<DriverScheduling>> map = cache.getCacheScheduling(key);
        Map<String, Object> typeMap = new HashMap<>(map.size());
        switch (type) {
            case "device":
                return schedulingMapper.queryNumberByDevice();
            case "line":
                for (Map.Entry<String, List<DriverScheduling>> entry : map.entrySet()) {
                    for (DriverScheduling scheduling : entry.getValue()) {
                        typeMap.put(scheduling.getLineName(), "");
                    }
                }
                return typeMap.size();
            case "car":
                for (Map.Entry<String, List<DriverScheduling>> entry : map.entrySet()) {
                    for (DriverScheduling scheduling : entry.getValue()) {
                        typeMap.put(scheduling.getNbbm(), "");
                    }
                }
                return typeMap.size();
            case "sale":
                for (Map.Entry<String, List<DriverScheduling>> entry : map.entrySet()) {
                    for (DriverScheduling scheduling : entry.getValue()) {
                        if (SALE_STRING.equals(scheduling.getPosts()) && BC_TYPE_OUT.equals(scheduling.getBcType()) && !Objects.isNull(scheduling.getNbbm()) && !Objects.isNull(scheduling.getSignInId())) {
                            typeMap.put(scheduling.getJobCode() + scheduling.getBcType(), "");
                        }
                    }
                }
                return typeMap.size();
            case "driver":
                for (Map.Entry<String, List<DriverScheduling>> entry : map.entrySet()) {
                    for (DriverScheduling scheduling : entry.getValue()) {
                        if (DRIVER_STRING.equals(scheduling.getPosts()) && BC_TYPE_OUT.equals(scheduling.getBcType()) && !Objects.isNull(scheduling.getNbbm()) && !Objects.isNull(scheduling.getSignInId())) {
                            typeMap.put(scheduling.getJobCode() + scheduling.getBcType(), "");
                        }
                    }
                }
                return typeMap.size();
            case "auxiliary":
                for (Map.Entry<String, List<DriverScheduling>> entry : map.entrySet()) {
                    for (DriverScheduling scheduling : entry.getValue()) {
                        if (Objects.isNull(scheduling.getNbbm()) && BC_TYPE_OUT.equals(scheduling.getBcType()) && !Objects.isNull(scheduling.getSignInId())) {
                            typeMap.put(scheduling.getJobCode() + scheduling.getBcType(), "");
                        }
                    }
                }
                return typeMap.size();
            default:
                return 0;
        }
    }
}